[Bug 1725869] [NEW] libc6-dev:amd64 (2.26-0ubuntu2) has unusable signbit for C++ programs

Andrew Paxie 1725869 at bugs.launchpad.net
Sun Oct 22 00:22:31 UTC 2017


Public bug reported:

Environment
-----------

Test program compiled on Artful Aardvark Ubuntu 17.10.

$ which g++-4.8
/usr/bin/g++-4.8

$ /usr/bin/g++-4.8 --version
g++-4.8 (Ubuntu 4.8.5-4ubuntu6) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ which g++-4.9
/usr/bin/g++-4.9

$ /usr/bin/g++-4.9 --version
g++-4.9 (Ubuntu 4.9.4-2ubuntu1) 4.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ which g++-5
/usr/bin/g++-5

$ /usr/bin/g++-5 --version
g++-5 (Ubuntu 5.5.0-1ubuntu1) 5.4.1 20171010
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ which g++-6
/usr/bin/g++-6

$ /usr/bin/g++-6 --version
g++-6 (Ubuntu 6.4.0-8ubuntu1) 6.4.0 20171010
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ which g++-7
/usr/bin/g++-7

$ /usr/bin/g++-7 --version
g++-7 (Ubuntu 7.2.0-8ubuntu3) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ dpkg --status libc6-dev:amd64
Package: libc6-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 18041
Maintainer: Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com>
Architecture: amd64
Multi-Arch: same
Source: glibc
Version: 2.26-0ubuntu2
Provides: libc-dev
Depends: libc6 (= 2.26-0ubuntu2), libc-dev-bin (= 2.26-0ubuntu2), linux-libc-dev (>= 4.13.0)
Suggests: glibc-doc, manpages-dev
Breaks: binutils (<< 2.26), binutils-gold (<< 2.20.1-11), cmake (<< 2.8.4+dfsg.1-5), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2), gcc-4.6 (<< 4.6.0-12), libhwloc-dev (<< 1.2-3), libjna-java (<< 3.2.7-4), liblouis-dev (<< 2.3.0-2), liblouisxml-dev (<< 2.4.0-2), make (<< 3.81-8.1), pkg-config (<< 0.26-1)
Conflicts: libc0.1-dev, libc0.3-dev, libc6.1-dev
Description: GNU C Library: Development Libraries and Header Files
 Contains the symlinks, headers, and object files needed to compile
 and link programs which use the standard C library.
Homepage: http://www.gnu.org/software/libc/libc.html
Original-Maintainer: GNU Libc Maintainers <debian-glibc at lists.debian.org>


Test cases that fail
--------------------

$ g++-5 -x c++ - <<EOF
#include <math.h>
int main()
{
  return signbit(1.0);
}
EOF

In file included from <stdin>:1:0:
<stdin>: In function ‘int main()’:
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘float’
<stdin>:4:10: error: ‘__builtin_types_compatible_p’ was not declared in this scope
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘double’
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘long’
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’

$ g++-4.9 -x c++ - <<EOF
#include <math.h>
int main()
{
  return signbit(1.0);
}
EOF

In file included from <stdin>:1:0:
<stdin>: In function ‘int main()’:
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘float’
<stdin>:4:10: error: ‘__builtin_types_compatible_p’ was not declared in this scope
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘double’
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘long’
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’

$ g++-4.8 -x c++ - <<EOF
#include <math.h>
int main()
{
  return signbit(1.0);
}
EOF

In file included from <stdin>:1:0:
<stdin>: In function ‘int main()’:
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘float’
<stdin>:4:10: error: ‘__builtin_types_compatible_p’ was not declared in this scope
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘double’
<stdin>:4:10: error: expected primary-expression before ‘__typeof’
<stdin>:4:10: error: expected primary-expression before ‘long’
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
<stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
<stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’


Test cases that succeed
-----------------------

$ g++-6 -x c++ - <<EOF
#include <math.h>
int main()
{
  return signbit(1.0);
}
EOF

$ g++-7 -x c++ - <<EOF
#include <math.h>
int main()
{
  return signbit(1.0);
}
EOF


Expected result
---------------

Successful compile and return 0.


Supposed cause
--------------

The definition of function-like macro __MATH_TG at 
lines 343-74 of /usr/include/math.h
requires some finesse to handle C++ programs.

As noted in

gcc.gnu.org, "6.59 Other Built-in Functions Provided by GCC"
Available: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
Accessed: 22 October 2017

the built-in functions __builtin_choose_expr and __builtin_types_compatible_p
are only available in C. 


Workaround
----------

Hack /usr/include/math.h and modify line 346

#elif __HAVE_DISTINCT_FLOAT128

to read

#elif __HAVE_DISTINCT_FLOAT128 && !__cplusplus

This clearly doesn't cover all the cases but you get the picture.

** Affects: glibc (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to glibc in Ubuntu.
https://bugs.launchpad.net/bugs/1725869

Title:
  libc6-dev:amd64 (2.26-0ubuntu2) has unusable signbit for C++ programs

Status in glibc package in Ubuntu:
  New

Bug description:
  Environment
  -----------

  Test program compiled on Artful Aardvark Ubuntu 17.10.

  $ which g++-4.8
  /usr/bin/g++-4.8

  $ /usr/bin/g++-4.8 --version
  g++-4.8 (Ubuntu 4.8.5-4ubuntu6) 4.8.5
  Copyright (C) 2015 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  $ which g++-4.9
  /usr/bin/g++-4.9

  $ /usr/bin/g++-4.9 --version
  g++-4.9 (Ubuntu 4.9.4-2ubuntu1) 4.9.4
  Copyright (C) 2015 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  $ which g++-5
  /usr/bin/g++-5

  $ /usr/bin/g++-5 --version
  g++-5 (Ubuntu 5.5.0-1ubuntu1) 5.4.1 20171010
  Copyright (C) 2015 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  $ which g++-6
  /usr/bin/g++-6

  $ /usr/bin/g++-6 --version
  g++-6 (Ubuntu 6.4.0-8ubuntu1) 6.4.0 20171010
  Copyright (C) 2017 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  $ which g++-7
  /usr/bin/g++-7

  $ /usr/bin/g++-7 --version
  g++-7 (Ubuntu 7.2.0-8ubuntu3) 7.2.0
  Copyright (C) 2017 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  $ dpkg --status libc6-dev:amd64
  Package: libc6-dev
  Status: install ok installed
  Priority: optional
  Section: libdevel
  Installed-Size: 18041
  Maintainer: Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com>
  Architecture: amd64
  Multi-Arch: same
  Source: glibc
  Version: 2.26-0ubuntu2
  Provides: libc-dev
  Depends: libc6 (= 2.26-0ubuntu2), libc-dev-bin (= 2.26-0ubuntu2), linux-libc-dev (>= 4.13.0)
  Suggests: glibc-doc, manpages-dev
  Breaks: binutils (<< 2.26), binutils-gold (<< 2.20.1-11), cmake (<< 2.8.4+dfsg.1-5), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2), gcc-4.6 (<< 4.6.0-12), libhwloc-dev (<< 1.2-3), libjna-java (<< 3.2.7-4), liblouis-dev (<< 2.3.0-2), liblouisxml-dev (<< 2.4.0-2), make (<< 3.81-8.1), pkg-config (<< 0.26-1)
  Conflicts: libc0.1-dev, libc0.3-dev, libc6.1-dev
  Description: GNU C Library: Development Libraries and Header Files
   Contains the symlinks, headers, and object files needed to compile
   and link programs which use the standard C library.
  Homepage: http://www.gnu.org/software/libc/libc.html
  Original-Maintainer: GNU Libc Maintainers <debian-glibc at lists.debian.org>

  
  Test cases that fail
  --------------------

  $ g++-5 -x c++ - <<EOF
  #include <math.h>
  int main()
  {
    return signbit(1.0);
  }
  EOF

  In file included from <stdin>:1:0:
  <stdin>: In function ‘int main()’:
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘float’
  <stdin>:4:10: error: ‘__builtin_types_compatible_p’ was not declared in this scope
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘double’
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘long’
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’

  $ g++-4.9 -x c++ - <<EOF
  #include <math.h>
  int main()
  {
    return signbit(1.0);
  }
  EOF

  In file included from <stdin>:1:0:
  <stdin>: In function ‘int main()’:
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘float’
  <stdin>:4:10: error: ‘__builtin_types_compatible_p’ was not declared in this scope
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘double’
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘long’
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’

  $ g++-4.8 -x c++ - <<EOF
  #include <math.h>
  int main()
  {
    return signbit(1.0);
  }
  EOF

  In file included from <stdin>:1:0:
  <stdin>: In function ‘int main()’:
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘float’
  <stdin>:4:10: error: ‘__builtin_types_compatible_p’ was not declared in this scope
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘double’
  <stdin>:4:10: error: expected primary-expression before ‘__typeof’
  <stdin>:4:10: error: expected primary-expression before ‘long’
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: error: ‘__builtin_choose_expr’ was not declared in this scope
  <stdin>:4:10: error: redeclaration of ‘<typeprefixerror>__builtin_choose_expr’
  <stdin>:4:10: note: previous declaration ‘<typeprefixerror>__builtin_choose_expr’

  
  Test cases that succeed
  -----------------------

  $ g++-6 -x c++ - <<EOF
  #include <math.h>
  int main()
  {
    return signbit(1.0);
  }
  EOF

  $ g++-7 -x c++ - <<EOF
  #include <math.h>
  int main()
  {
    return signbit(1.0);
  }
  EOF

  
  Expected result
  ---------------

  Successful compile and return 0.

  
  Supposed cause
  --------------

  The definition of function-like macro __MATH_TG at 
  lines 343-74 of /usr/include/math.h
  requires some finesse to handle C++ programs.

  As noted in

  gcc.gnu.org, "6.59 Other Built-in Functions Provided by GCC"
  Available: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
  Accessed: 22 October 2017

  the built-in functions __builtin_choose_expr and __builtin_types_compatible_p
  are only available in C. 

  
  Workaround
  ----------

  Hack /usr/include/math.h and modify line 346

  #elif __HAVE_DISTINCT_FLOAT128

  to read

  #elif __HAVE_DISTINCT_FLOAT128 && !__cplusplus

  This clearly doesn't cover all the cases but you get the picture.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1725869/+subscriptions



More information about the foundations-bugs mailing list