[PATCH] math.h: Do use __MATH_TG_BUILTIN_CLASSIFY for C++
H.J. Lu
hjl.tools@gmail.com
Tue Dec 30 06:47:44 GMT 2025
On Tue, Dec 30, 2025 at 2:34 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Tue, Dec 30, 2025 at 6:41 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > 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.
>
> Something like this.
>
> --
> H.J.
We should also add generic C++ fpclassify tests.
--
H.J.
More information about the Libc-alpha
mailing list