diff options
author | Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com> | 2017-08-11 14:29:06 -0300 |
---|---|---|
committer | Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com> | 2017-08-18 12:18:36 -0300 |
commit | 47a67213a9f51c5f8816d240500b10db605d8b77 (patch) | |
tree | a00a1a49fd40e25061b9c02246caf8f80e32f6bf /math | |
parent | c647fb885cb678471f6b6a66f394b4ca5515a016 (diff) | |
download | glibc-47a67213a9f51c5f8816d240500b10db605d8b77.zip glibc-47a67213a9f51c5f8816d240500b10db605d8b77.tar.gz glibc-47a67213a9f51c5f8816d240500b10db605d8b77.tar.bz2 |
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.
Diffstat (limited to 'math')
-rw-r--r-- | math/math.h | 8 |
1 files changed, 6 insertions, 2 deletions
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)) |