about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--bits/libc-header-start.h28
-rw-r--r--include/features.h2
-rw-r--r--manual/creature.texi7
-rw-r--r--math/bits/mathcalls.h12
-rw-r--r--math/math.h30
6 files changed, 71 insertions, 14 deletions
diff --git a/NEWS b/NEWS
index 266837bf2d..6f4d325d55 100644
--- a/NEWS
+++ b/NEWS
@@ -25,6 +25,12 @@ Major new features:
 
 * The ISO C2X function timespec_getres has been added.
 
+* 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