mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Provide a C++ version of issignaling that does not use __MATH_TG
The macro __MATH_TG contains the logic to select between long double and _Float128, when these types are ABI-distinct. This logic relies on __builtin_types_compatible_p, which is not available in C++ mode. On the other hand, C++ function overloading provides the means to distinguish between the floating-point types. The overloading resolution will match the correct parameter regardless of type qualifiers, i.e.: const and volatile. Tested for powerpc64le, s390x, and x86_64. * math/math.h [defined __cplusplus] (issignaling): Provide a C++ definition for issignaling that does not rely on __MATH_TG, since __MATH_TG uses __builtin_types_compatible_p, which is only available in C mode. (CFLAGS-test-math-issignaling.cc): New variable. * math/Makefile [CXX] (tests): Add test-math-issignaling. * math/test-math-issignaling.cc: New test for C++ implementation of type-generic issignaling. * sysdeps/powerpc/powerpc64le/Makefile [subdir == math] (CXXFLAGS-test-math-issignaling.cc): Add -mfloat128 to the build options of test-math-issignaling on powerpc64le.
This commit is contained in:
19
math/math.h
19
math/math.h
@ -474,7 +474,24 @@ enum
|
||||
# include <bits/iscanonical.h>
|
||||
|
||||
/* Return nonzero value if X is a signaling NaN. */
|
||||
# define issignaling(x) __MATH_TG ((x), __issignaling, (x))
|
||||
# ifndef __cplusplus
|
||||
# define issignaling(x) __MATH_TG ((x), __issignaling, (x))
|
||||
# else
|
||||
/* In C++ mode, __MATH_TG cannot be used, because it relies on
|
||||
__builtin_types_compatible_p, which is a C-only builtin. On the
|
||||
other hand, overloading provides the means to distinguish between
|
||||
the floating-point types. The overloading resolution will match
|
||||
the correct parameter (regardless of type qualifiers (i.e.: const
|
||||
and volatile). */
|
||||
extern "C++" {
|
||||
inline int issignaling (float __val) { return __issignalingf (__val); }
|
||||
inline int issignaling (double __val) { return __issignaling (__val); }
|
||||
inline int issignaling (long double __val) { return __issignalingl (__val); }
|
||||
# if __HAVE_DISTINCT_FLOAT128
|
||||
inline int issignaling (_Float128 __val) { return __issignalingf128 (__val); }
|
||||
# endif
|
||||
} /* extern C++ */
|
||||
# endif
|
||||
|
||||
/* Return nonzero value if X is subnormal. */
|
||||
# define issubnormal(x) (fpclassify (x) == FP_SUBNORMAL)
|
||||
|
Reference in New Issue
Block a user