From: Gabriel F. T. Gomes Date: Fri, 11 Aug 2017 17:29:06 +0000 (-0300) Subject: Do not use __builtin_types_compatible_p in C++ mode (bug 21930) X-Git-Tag: glibc-2.27~1130 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=47a67213a9f51c5f8816d240500b10db605d8b77;p=glibc.git Do not use __builtin_types_compatible_p in C++ mode (bug 21930) The logic to define isinf for float128 depends on the availability of __builtin_types_compatible_p, which is only available in C mode, however, the conditionals do not check for C or C++ mode. This lead to an error in libstdc++ configure, as reported by bug 21930. This patch adds a conditional for C mode in the definition of isinf for float128. No definition is provided in C++ mode, since libstdc++ headers undefine isinf. Tested for powerpc64le (glibc test suite and libstdc++-v3 configure). [BZ #21930] * math/math.h (isinf): Check if in C or C++ mode before using __builtin_types_compatible_p, since this is a C mode feature. --- diff --git a/ChangeLog b/ChangeLog index 4b99033a1d..2050a1cacd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-08-18 Gabriel F. T. Gomes + + [BZ #21930] + * math/math.h (isinf): Check if in C or C++ mode before using + __builtin_types_compatible_p, since this is a C mode feature. + 2017-08-18 Adhemerval Zanella * sysdeps/generic/not-cancel.h (write_not_cancel): Remove macro. diff --git a/math/math.h b/math/math.h index e21708045a..dea8dbe1ae 100644 --- a/math/math.h +++ b/math/math.h @@ -442,8 +442,12 @@ enum /* Return nonzero value if X is positive or negative infinity. */ # if __HAVE_DISTINCT_FLOAT128 && !__GNUC_PREREQ (7,0) \ - && !defined __SUPPORT_SNAN__ - /* __builtin_isinf_sign is broken for float128 only before GCC 7.0. */ + && !defined __SUPPORT_SNAN__ && !defined __cplusplus + /* Since __builtin_isinf_sign is broken for float128 before GCC 7.0, + use the helper function, __isinff128, with older compilers. This is + only provided for C mode, because in C++ mode, GCC has no support + for __builtin_types_compatible_p (and when in C++ mode, this macro is + not used anyway, because libstdc++ headers undefine it). */ # define isinf(x) \ (__builtin_types_compatible_p (__typeof (x), _Float128) \ ? __isinff128 (x) : __builtin_isinf_sign (x))