[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