[PATCH] math.h: Do use __MATH_TG_BUILTIN_CLASSIFY for C++
H.J. Lu
hjl.tools@gmail.com
Mon Dec 29 22:41:36 GMT 2025
On Mon, Dec 29, 2025 at 11:12 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> The __MATH_TG_BUILTIN_CLASSIFY macro can not be used in C++ mode due
> it might use __builtin_types_compatible_p, which is a C-only builtin.
>
> Checked with bmg targetting x86_64-linux-gnu and on x86_64-linux-gnu
> and aarch64 with gcc-15 and clang-18.
> ---
> math/math.h | 43 ++++++++++++++++++++++++++-----------------
> 1 file changed, 26 insertions(+), 17 deletions(-)
>
> diff --git a/math/math.h b/math/math.h
> index 96b64379f7..49489293fc 100644
> --- a/math/math.h
> +++ b/math/math.h
> @@ -1173,21 +1173,25 @@ enum
>
> /* Return number of classification appropriate for X. */
> # if ((__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__) \
> - || __glibc_clang_prereq (2,8)) \
> - && (!defined __OPTIMIZE_SIZE__ || defined __cplusplus)
> - /* The check for __cplusplus allows the use of the builtin, even
> - when optimization for size is on. This is provided for
> - libstdc++, only to let its configure test work when it is built
> - with -Os. No further use of this definition of fpclassify is
> - expected in C++ mode, since libstdc++ provides its own version
> - of fpclassify in cmath (which undefines fpclassify). */
> -# define fpclassify(x) \
> - __MATH_TG_BUILTIN_CLASSIFY ((x), \
> - __builtin_fpclassify, (FP_NAN, FP_INFINITE, \
> - FP_NORMAL, FP_SUBNORMAL, \
> - FP_ZERO, x), \
> - fpclassify, (x), \
> - __FP_BUILTIN_FPCLASSIFY_DENORMAL)
> + || __glibc_clang_prereq (2,8)) \
> + && !defined __cplusplus
> + /* The __MATH_TG_BUILTIN_CLASSIFY macro can not be used in C++ mode due
> + it might use __builtin_types_compatible_p, which is C-only builtin. */
> +# define fpclassify(x) \
> + __MATH_TG_BUILTIN_CLASSIFY ((x), \
> + __builtin_fpclassify, (FP_NAN, FP_INFINITE, \
> + FP_NORMAL, FP_SUBNORMAL, \
> + FP_ZERO, x), \
> + fpclassify, (x), \
> + __FP_BUILTIN_FPCLASSIFY_DENORMAL)
> +# elif defined __cplusplus
> + /* The check for __cplusplus allows the use of the builtin, even
> + when optimization for size is on. This is provided for
> + libstdc++ and no further use of this definition of fpclassify is
> + expected in C++ mode, since libstdc++ provides its own version
> + of fpclassify in cmath (which undefines fpclassify). */
> +# define fpclassify(x) __builtin_fpclassify (FP_NAN, FP_INFINITE, \
> + FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x)
> # else
> # define fpclassify(x) __MATH_TG ((x), __fpclassify, (x))
> # endif
> @@ -1247,12 +1251,17 @@ enum
> # define isinf(x) \
> (__builtin_types_compatible_p (__typeof (x), _Float128) \
> ? __isinff128 (x) : __builtin_isinf_sign (x))
> -# elif (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__) \
> - || __glibc_clang_prereq (3,7)
> + /* The __MATH_TG_BUILTIN_CLASSIFY macro can not be used in C++ mode due
> + it might use __builtin_types_compatible_p, which is C-only builtin. */
> +# elif ((__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__) \
> + || __glibc_clang_prereq (3,7)) \
> + && !defined __cplusplus
> # define isinf(x) __MATH_TG_BUILTIN_CLASSIFY ((x), \
> __builtin_isinf_sign, (x), \
> isinf, (x), \
> __FP_BUILTIN_ISINF_SIGN_DENORMAL)
> +# elif defined __cplusplus
> +# define isinf(x) __builtin_isinf_sign (x)
> # else
> # define isinf(x) __MATH_TG ((x), __isinf, (x))
> # endif
> --
> 2.43.0
>
Please add a C++ test for this change.
--
H.J.
More information about the Libc-alpha
mailing list