Message ID | alpine.DEB.2.22.394.2105122355290.88150@digraph.polyomino.org.uk |
---|---|
State | New |
Headers | show |
Series | Update floating-point feature test macro handling for C2X | expand |
Ping. This patch <https://sourceware.org/pipermail/libc-alpha/2021-May/126316.html> is pending review.
* Joseph Myers: > +@defvr Macro __STDC_WANT_IEC_60559_EXT__ > +@standards{ISO, (none)} > +If you define this macro, ISO C2X features defined in Annex F of that > +standard are enabled. This affects declarations of the > +@code{totalorder} functions and functions related to NaN payloads. > +@end defvr Should this say “macros related to NaN payloads”? Thanks, Florian
On Fri, 21 May 2021, Florian Weimer via Libc-alpha wrote: > * Joseph Myers: > > > +@defvr Macro __STDC_WANT_IEC_60559_EXT__ > > +@standards{ISO, (none)} > > +If you define this macro, ISO C2X features defined in Annex F of that > > +standard are enabled. This affects declarations of the > > +@code{totalorder} functions and functions related to NaN payloads. > > +@end defvr > > Should this say “macros related to NaN payloads”? No. The getpayload / setpayload / setpayloadsig functions are all functions, not macros (and since they have pointer arguments, there are no corresponding type-generic macros either).
Ping^2. This patch <https://sourceware.org/pipermail/libc-alpha/2021-May/126316.html> is still pending review.
On 12/05/2021 20:57, Joseph Myers wrote: > ISO C2X has made some changes to the handling of feature test macros > related to features from the floating-point TSes, and to exactly what > such features are present in what headers, that require corresponding > changes in glibc. > > * For the few features that were controlled by > __STDC_WANT_IEC_60559_BFP_EXT__ (and the corresponding DFP macro) in > C2X, there is now instead a new feature test macro > __STDC_WANT_IEC_60559_EXT__ covering both binary and decimal FP. > This controls CR_DECIMAL_DIG in <float.h> (provided by GCC; I > implemented support for the new feature test macro for GCC 11) and > the totalorder and payload functions in <math.h>. C2X no longer > says anything about __STDC_WANT_IEC_60559_BFP_EXT__ (so it's > appropriate for that macro to continue to enable exactly the > features from TS 18661-1). > > * The SNAN macros for each floating-point type have moved to <float.h> > (and been renamed in the process). Thus, the copies in <math.h> > should only be defined for __STDC_WANT_IEC_60559_BFP_EXT__, not for > C2X. > > * The fmaxmag and fminmag functions have been removed (replaced by new > functions for the new min/max operations in IEEE 754-2019). Thus > those should also only be declared for > __STDC_WANT_IEC_60559_BFP_EXT__. > > * The _FloatN / _FloatNx handling for the last two points in glibc is > trickier, since __STDC_WANT_IEC_60559_TYPES_EXT__ is still in C2X > (the integration of TS 18661-3 as an Annex, that is, which hasn't > yet been merged into the C standard git repository but has been > accepted by WG14), so C2X with that macro should not declare some > things that are declared for older standards with that macro. The > approach taken here is to provide the declarations (when > __STDC_WANT_IEC_60559_TYPES_EXT__ is enabled) only when (defined > __USE_GNU || !__GLIBC_USE (ISOC2X)), so if C2X features are enabled > then those declarations (that are only in TS 18661-3 and not in C2X) > will only be provided if _GNU_SOURCE is defined as well. Thus > _GNU_SOURCE remains a superset of the TS features as well as of C2X. I haven't follow up the standards itself, but the changes sounds reasonable. > > Some other somewhat related changes in C2X are not addressed here. > There's an open proposal not to include the fmin and fmax functions > for the _FloatN / _FloatNx types, given the new min/max operations, > which could be handled like the previous point if adopted. And the > fromfp functions have been changed to return a result in floating type > rather than intmax_t / uintmax_t; my inclination there is to treat > that like that change of totalorder type (new symbol versions etc. for > the ABI change; old versions become compat symbols and are no longer > supported as an API). > > Tested for x86_64 and x86. I check on some more architecture without any regressions: aarch64, arm-gnueabihf, powerpc64le, riscv64, s390x, and sparc64. > > --- > > I would like review of this patch. LGTM, thanks. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > > diff --git a/NEWS b/NEWS > index a5631af920..17228c1246 100644 > --- a/NEWS > +++ b/NEWS > @@ -23,6 +23,12 @@ Major new features: > /proc to be mounted. However, different than fexecve, if the syscall is not > supported by the kernel an error is returned instead of trying a fallback. > > +* The feature test macro __STDC_WANT_IEC_60559_EXT__, from draft ISO > + C2X, is supported to enable declarations of functions defined in Annex F > + of C2X. Those declarations are also enabled when > + __STDC_WANT_IEC_60559_BFP_EXT__, as specified in TS 18661-1, is > + defined, and when _GNU_SOURCE is defined. > + > Deprecated and removed features, and other changes affecting compatibility: > > * The function pthread_mutex_consistent_np has been deprecated; programs Ok. > diff --git a/bits/libc-header-start.h b/bits/libc-header-start.h > index 296e1cef9b..47f39105a2 100644 > --- a/bits/libc-header-start.h > +++ b/bits/libc-header-start.h > @@ -44,8 +44,26 @@ > > /* ISO/IEC TS 18661-1:2014 defines the __STDC_WANT_IEC_60559_BFP_EXT__ > macro. Most but not all symbols enabled by that macro in TS > - 18661-1 are enabled unconditionally in C2X; the symbols in Annex F > - still require that macro in C2X. */ > + 18661-1 are enabled unconditionally in C2X. In C2X, the symbols in > + Annex F still require a new feature test macro > + __STDC_WANT_IEC_60559_EXT__ instead (C2X does not define > + __STDC_WANT_IEC_60559_BFP_EXT__), while a few features from TS > + 18661-1 are not included in C2X (and thus should depend on > + __STDC_WANT_IEC_60559_BFP_EXT__ even when C2X features are > + enabled). > + > + __GLIBC_USE (IEC_60559_BFP_EXT) controls those features from TS > + 18661-1 not included in C2X. > + > + __GLIBC_USE (IEC_60559_BFP_EXT_C2X) controls those features from TS > + 18661-1 that are also included in C2X (with no feature test macro > + required in C2X). > + > + __GLIBC_USE (IEC_60559_EXT) controls those features from TS 18661-1 > + that are included in C2X but conditional on > + __STDC_WANT_IEC_60559_EXT__. (There are currently no features > + conditional on __STDC_WANT_IEC_60559_EXT__ that are not in TS > + 18661-1.) */ Ok. > #undef __GLIBC_USE_IEC_60559_BFP_EXT > #if defined __USE_GNU || defined __STDC_WANT_IEC_60559_BFP_EXT__ > # define __GLIBC_USE_IEC_60559_BFP_EXT 1 > @@ -58,6 +76,12 @@ > #else > # define __GLIBC_USE_IEC_60559_BFP_EXT_C2X 0 > #endif > +#undef __GLIBC_USE_IEC_60559_EXT > +#if __GLIBC_USE (IEC_60559_BFP_EXT) || defined __STDC_WANT_IEC_60559_EXT__ > +# define __GLIBC_USE_IEC_60559_EXT 1 > +#else > +# define __GLIBC_USE_IEC_60559_EXT 0 > +#endif > > /* ISO/IEC TS 18661-4:2015 defines the > __STDC_WANT_IEC_60559_FUNCS_EXT__ macro. Other than the reduction Ok, so if __STDC_WANT_IEC_60559_BFP_EXT__ is defined *and* __STDC_WANT_IEC_60559_EXT__ is also defined we use the definition from __GLIBC_USE_IEC_60559_EXT (as per comment as well). > diff --git a/include/features.h b/include/features.h > index eb97470afa..fcd1a9502f 100644 > --- a/include/features.h > +++ b/include/features.h > @@ -33,6 +33,8 @@ > Extensions to ISO C11 from TS 18661-4:2015. > __STDC_WANT_IEC_60559_TYPES_EXT__ > Extensions to ISO C11 from TS 18661-3:2015. > + __STDC_WANT_IEC_60559_EXT__ > + ISO C2X interfaces defined only in Annex F. > > _POSIX_SOURCE IEEE Std 1003.1. > _POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2; Ok. > diff --git a/manual/creature.texi b/manual/creature.texi > index 5090735e4f..705a949089 100644 > --- a/manual/creature.texi > +++ b/manual/creature.texi > @@ -215,6 +215,13 @@ enabled. Only some of the features from this TS are supported by > @theglibc{}. > @end defvr > > +@defvr Macro __STDC_WANT_IEC_60559_EXT__ > +@standards{ISO, (none)} > +If you define this macro, ISO C2X features defined in Annex F of that > +standard are enabled. This affects declarations of the > +@code{totalorder} functions and functions related to NaN payloads. > +@end defvr > + > @defvr Macro _GNU_SOURCE > @standards{GNU, (none)} > If you define this macro, everything is included: @w{ISO C89}, @w{ISO Should it add a note for CR_DECIMAL_DIG as well? Or the gcc documentation is suffice? > diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h > index 2361dd3982..dc145b4bcf 100644 > --- a/math/bits/mathcalls.h > +++ b/math/bits/mathcalls.h > @@ -364,17 +364,21 @@ __MATHDECL (__intmax_t, fromfpx,, (_Mdouble_ __x, int __round, > __MATHDECL (__uintmax_t, ufromfpx,, (_Mdouble_ __x, int __round, > unsigned int __width)); > > +/* Canonicalize floating-point representation. */ > +__MATHDECL_1 (int, canonicalize,, (_Mdouble_ *__cx, const _Mdouble_ *__x)); > +#endif > + Ok it moves canonicalize to __GLIBC_USE (IEC_60559_BFP_EXT_C2X). > +#if (__GLIBC_USE (IEC_60559_BFP_EXT) \ > + || (__MATH_DECLARING_FLOATN \ > + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X)))) > /* Return value with maximum magnitude. */ > __MATHCALLX (fmaxmag,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); > > /* Return value with minimum magnitude. */ > __MATHCALLX (fminmag,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); > - > -/* Canonicalize floating-point representation. */ > -__MATHDECL_1 (int, canonicalize,, (_Mdouble_ *__cx, const _Mdouble_ *__x)); > #endif > Ok, fmaxmag and fminmag are not only declared for __STDC_WANT_IEC_60559_BFP_EXT__. > -#if __GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN > +#if __GLIBC_USE (IEC_60559_EXT) || __MATH_DECLARING_FLOATN > /* Total order operation. */ > __MATHDECL_1 (int, totalorder,, (const _Mdouble_ *__x, > const _Mdouble_ *__y)) Ok. > diff --git a/math/math.h b/math/math.h > index 0e205158a9..6b7ac79122 100644 > --- a/math/math.h > +++ b/math/math.h > @@ -104,7 +104,7 @@ __BEGIN_DECLS > # endif > #endif /* __USE_ISOC99 */ > > -#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X) > +#if __GLIBC_USE (IEC_60559_BFP_EXT) > /* Signaling NaN macros, if supported. */ > # if __GNUC_PREREQ (3, 3) > # define SNANF (__builtin_nansf ("")) > @@ -112,25 +112,39 @@ __BEGIN_DECLS > # define SNANL (__builtin_nansl ("")) > # endif > #endif > -#if __HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT) > +#if (__HAVE_FLOAT16 \ > + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ > + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) > # define SNANF16 (__builtin_nansf16 ("")) > #endif > -#if __HAVE_FLOAT32 && __GLIBC_USE (IEC_60559_TYPES_EXT) > +#if (__HAVE_FLOAT32 \ > + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ > + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) > # define SNANF32 (__builtin_nansf32 ("")) > #endif > -#if __HAVE_FLOAT64 && __GLIBC_USE (IEC_60559_TYPES_EXT) > +#if (__HAVE_FLOAT64 \ > + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ > + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) > # define SNANF64 (__builtin_nansf64 ("")) > #endif > -#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT) > +#if (__HAVE_FLOAT128 \ > + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ > + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) > # define SNANF128 (__builtin_nansf128 ("")) > #endif > -#if __HAVE_FLOAT32X && __GLIBC_USE (IEC_60559_TYPES_EXT) > +#if (__HAVE_FLOAT32X \ > + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ > + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) > # define SNANF32X (__builtin_nansf32x ("")) > #endif > -#if __HAVE_FLOAT64X && __GLIBC_USE (IEC_60559_TYPES_EXT) > +#if (__HAVE_FLOAT64X \ > + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ > + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) > # define SNANF64X (__builtin_nansf64x ("")) > #endif > -#if __HAVE_FLOAT128X && __GLIBC_USE (IEC_60559_TYPES_EXT) > +#if (__HAVE_FLOAT128X \ > + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ > + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) > # define SNANF128X (__builtin_nansf128x ("")) > #endif > > Ok.
On Fri, 28 May 2021, Adhemerval Zanella via Libc-alpha wrote: > > @@ -215,6 +215,13 @@ enabled. Only some of the features from this TS are supported by > > @theglibc{}. > > @end defvr > > > > +@defvr Macro __STDC_WANT_IEC_60559_EXT__ > > +@standards{ISO, (none)} > > +If you define this macro, ISO C2X features defined in Annex F of that > > +standard are enabled. This affects declarations of the > > +@code{totalorder} functions and functions related to NaN payloads. > > +@end defvr > > + > > @defvr Macro _GNU_SOURCE > > @standards{GNU, (none)} > > If you define this macro, everything is included: @w{ISO C89}, @w{ISO > > Should it add a note for CR_DECIMAL_DIG as well? Or the gcc documentation > is suffice? I think this part of the manual is only expected to cover the effects of feature test macros on glibc's own headers, not on compiler-provided headers.
On 01/06/2021 14:30, Joseph Myers wrote: > On Fri, 28 May 2021, Adhemerval Zanella via Libc-alpha wrote: > >>> @@ -215,6 +215,13 @@ enabled. Only some of the features from this TS are supported by >>> @theglibc{}. >>> @end defvr >>> >>> +@defvr Macro __STDC_WANT_IEC_60559_EXT__ >>> +@standards{ISO, (none)} >>> +If you define this macro, ISO C2X features defined in Annex F of that >>> +standard are enabled. This affects declarations of the >>> +@code{totalorder} functions and functions related to NaN payloads. >>> +@end defvr >>> + >>> @defvr Macro _GNU_SOURCE >>> @standards{GNU, (none)} >>> If you define this macro, everything is included: @w{ISO C89}, @w{ISO >> >> Should it add a note for CR_DECIMAL_DIG as well? Or the gcc documentation >> is suffice? > > I think this part of the manual is only expected to cover the effects of > feature test macros on glibc's own headers, not on compiler-provided > headers. > Fair enough.
diff --git a/NEWS b/NEWS index a5631af920..17228c1246 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,12 @@ Major new features: /proc to be mounted. However, different than fexecve, if the syscall is not supported by the kernel an error is returned instead of trying a fallback. +* The feature test macro __STDC_WANT_IEC_60559_EXT__, from draft ISO + C2X, is supported to enable declarations of functions defined in Annex F + of C2X. Those declarations are also enabled when + __STDC_WANT_IEC_60559_BFP_EXT__, as specified in TS 18661-1, is + defined, and when _GNU_SOURCE is defined. + Deprecated and removed features, and other changes affecting compatibility: * The function pthread_mutex_consistent_np has been deprecated; programs diff --git a/bits/libc-header-start.h b/bits/libc-header-start.h index 296e1cef9b..47f39105a2 100644 --- a/bits/libc-header-start.h +++ b/bits/libc-header-start.h @@ -44,8 +44,26 @@ /* ISO/IEC TS 18661-1:2014 defines the __STDC_WANT_IEC_60559_BFP_EXT__ macro. Most but not all symbols enabled by that macro in TS - 18661-1 are enabled unconditionally in C2X; the symbols in Annex F - still require that macro in C2X. */ + 18661-1 are enabled unconditionally in C2X. In C2X, the symbols in + Annex F still require a new feature test macro + __STDC_WANT_IEC_60559_EXT__ instead (C2X does not define + __STDC_WANT_IEC_60559_BFP_EXT__), while a few features from TS + 18661-1 are not included in C2X (and thus should depend on + __STDC_WANT_IEC_60559_BFP_EXT__ even when C2X features are + enabled). + + __GLIBC_USE (IEC_60559_BFP_EXT) controls those features from TS + 18661-1 not included in C2X. + + __GLIBC_USE (IEC_60559_BFP_EXT_C2X) controls those features from TS + 18661-1 that are also included in C2X (with no feature test macro + required in C2X). + + __GLIBC_USE (IEC_60559_EXT) controls those features from TS 18661-1 + that are included in C2X but conditional on + __STDC_WANT_IEC_60559_EXT__. (There are currently no features + conditional on __STDC_WANT_IEC_60559_EXT__ that are not in TS + 18661-1.) */ #undef __GLIBC_USE_IEC_60559_BFP_EXT #if defined __USE_GNU || defined __STDC_WANT_IEC_60559_BFP_EXT__ # define __GLIBC_USE_IEC_60559_BFP_EXT 1 @@ -58,6 +76,12 @@ #else # define __GLIBC_USE_IEC_60559_BFP_EXT_C2X 0 #endif +#undef __GLIBC_USE_IEC_60559_EXT +#if __GLIBC_USE (IEC_60559_BFP_EXT) || defined __STDC_WANT_IEC_60559_EXT__ +# define __GLIBC_USE_IEC_60559_EXT 1 +#else +# define __GLIBC_USE_IEC_60559_EXT 0 +#endif /* ISO/IEC TS 18661-4:2015 defines the __STDC_WANT_IEC_60559_FUNCS_EXT__ macro. Other than the reduction diff --git a/include/features.h b/include/features.h index eb97470afa..fcd1a9502f 100644 --- a/include/features.h +++ b/include/features.h @@ -33,6 +33,8 @@ Extensions to ISO C11 from TS 18661-4:2015. __STDC_WANT_IEC_60559_TYPES_EXT__ Extensions to ISO C11 from TS 18661-3:2015. + __STDC_WANT_IEC_60559_EXT__ + ISO C2X interfaces defined only in Annex F. _POSIX_SOURCE IEEE Std 1003.1. _POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2; diff --git a/manual/creature.texi b/manual/creature.texi index 5090735e4f..705a949089 100644 --- a/manual/creature.texi +++ b/manual/creature.texi @@ -215,6 +215,13 @@ enabled. Only some of the features from this TS are supported by @theglibc{}. @end defvr +@defvr Macro __STDC_WANT_IEC_60559_EXT__ +@standards{ISO, (none)} +If you define this macro, ISO C2X features defined in Annex F of that +standard are enabled. This affects declarations of the +@code{totalorder} functions and functions related to NaN payloads. +@end defvr + @defvr Macro _GNU_SOURCE @standards{GNU, (none)} If you define this macro, everything is included: @w{ISO C89}, @w{ISO diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index 2361dd3982..dc145b4bcf 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -364,17 +364,21 @@ __MATHDECL (__intmax_t, fromfpx,, (_Mdouble_ __x, int __round, __MATHDECL (__uintmax_t, ufromfpx,, (_Mdouble_ __x, int __round, unsigned int __width)); +/* Canonicalize floating-point representation. */ +__MATHDECL_1 (int, canonicalize,, (_Mdouble_ *__cx, const _Mdouble_ *__x)); +#endif + +#if (__GLIBC_USE (IEC_60559_BFP_EXT) \ + || (__MATH_DECLARING_FLOATN \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X)))) /* Return value with maximum magnitude. */ __MATHCALLX (fmaxmag,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); /* Return value with minimum magnitude. */ __MATHCALLX (fminmag,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); - -/* Canonicalize floating-point representation. */ -__MATHDECL_1 (int, canonicalize,, (_Mdouble_ *__cx, const _Mdouble_ *__x)); #endif -#if __GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN +#if __GLIBC_USE (IEC_60559_EXT) || __MATH_DECLARING_FLOATN /* Total order operation. */ __MATHDECL_1 (int, totalorder,, (const _Mdouble_ *__x, const _Mdouble_ *__y)) diff --git a/math/math.h b/math/math.h index 0e205158a9..6b7ac79122 100644 --- a/math/math.h +++ b/math/math.h @@ -104,7 +104,7 @@ __BEGIN_DECLS # endif #endif /* __USE_ISOC99 */ -#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X) +#if __GLIBC_USE (IEC_60559_BFP_EXT) /* Signaling NaN macros, if supported. */ # if __GNUC_PREREQ (3, 3) # define SNANF (__builtin_nansf ("")) @@ -112,25 +112,39 @@ __BEGIN_DECLS # define SNANL (__builtin_nansl ("")) # endif #endif -#if __HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT16 \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF16 (__builtin_nansf16 ("")) #endif -#if __HAVE_FLOAT32 && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT32 \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF32 (__builtin_nansf32 ("")) #endif -#if __HAVE_FLOAT64 && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT64 \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF64 (__builtin_nansf64 ("")) #endif -#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT128 \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF128 (__builtin_nansf128 ("")) #endif -#if __HAVE_FLOAT32X && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT32X \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF32X (__builtin_nansf32x ("")) #endif -#if __HAVE_FLOAT64X && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT64X \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF64X (__builtin_nansf64x ("")) #endif -#if __HAVE_FLOAT128X && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT128X \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF128X (__builtin_nansf128x ("")) #endif