From c2921b17a37e887b8a5ca9d84b875b9ba702b79c Mon Sep 17 00:00:00 2001 From: "Gabriel F. T. Gomes" Date: Mon, 21 Aug 2017 14:23:27 +0200 Subject: [PATCH 10] 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. (cherry picked from commit 47a67213a9f51c5f8816d240500b10db605d8b77) --- ChangeLog | 6 ++++++ NEWS | 1 + math/math.h | 8 ++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6886cd9..415fa3c 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-10 Gabriel F. T. Gomes [BZ #21941] diff --git a/NEWS b/NEWS index d57c405..75b82c8 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,7 @@ The following bugs are resolved with this release: [21242] assert: Suppress pedantic warning caused by statement expression [21885] getaddrinfo: Release resolver context on error in gethosts + [21930] Do not use __builtin_types_compatible_p in C++ mode [21932] Unpaired __resolv_context_get in generic get*_r implementation Version 2.26 diff --git a/math/math.h b/math/math.h index e217080..dea8dbe 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)) -- 2.7.4.GIT