public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [committed 1/3] libstdc++: Stop using _GLIBCXX_USE_C99_COMPLEX_TR1 in <complex>
@ 2023-05-16  9:11 Jonathan Wakely
  2023-05-16  9:11 ` [committed 2/3] libstdc++: Stop using _GLIBCXX_USE_C99_STDINT_TR1 in <cstdint> Jonathan Wakely
  2023-05-16  9:11 ` [committed 3/3] libstdc++: Stop using TR1 macros in <cctype> and <cfenv> Jonathan Wakely
  0 siblings, 2 replies; 3+ messages in thread
From: Jonathan Wakely @ 2023-05-16  9:11 UTC (permalink / raw)
  To: libstdc++, gcc-patches

Tested powerpc64le-linux. Pushed to trunk.

-- >8 --

The _GLIBCXX_USE_C99_COMPLEX_TR1 macro (and the comments about it in
acinclude.m4 and config.h) are misleading when it is also used for
<complex>, not only <tr1/complex>. It is also wrong, because the
configure checks for TR1 use -std=c++98 and a target might define cacos
etc. for C++11 but not for C++98.

Add a separate configure check for the inverse trigonometric functions
that are covered by _GLIBCXX_USE_C99_COMPLEX_TR1, but using -std=c++11
for the checks. Use the result of that separate check in <complex>.

libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_USE_C99): Check for complex inverse trig
	functions in C++11 mode and define _GLIBCXX_USE_C99_COMPLEX_ARC.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* doc/doxygen/user.cfg.in (PREDEFINED): Add new macro.
	* include/std/complex: Check _GLIBCXX_USE_C99_COMPLEX_ARC
	instead of _GLIBCXX_USE_C99_COMPLEX_TR1.
---
 libstdc++-v3/acinclude.m4            | 37 +++++++++++++++++++
 libstdc++-v3/config.h.in             |  5 +++
 libstdc++-v3/configure               | 53 ++++++++++++++++++++++++++++
 libstdc++-v3/doc/doxygen/user.cfg.in |  1 +
 libstdc++-v3/include/std/complex     | 14 ++++----
 5 files changed, 103 insertions(+), 7 deletions(-)

diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 0ce3b8b5b31..84b12adbc24 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -1200,6 +1200,43 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
         requires corresponding C99 library functions to be present.])
     fi
 
+    # Check for the existence of <complex.h> complex inverse trigonometric
+    # math functions used by <complex> for C++11 and later.
+    ac_c99_complex_arc=no;
+    if test x"$ac_has_complex_h" = x"yes"; then
+      AC_MSG_CHECKING([for ISO C99 support for inverse trig functions in <complex.h>])
+      AC_TRY_COMPILE([#include <complex.h>],
+		     [typedef __complex__ float float_type; float_type tmpf;
+		      cacosf(tmpf);
+		      casinf(tmpf);
+		      catanf(tmpf);
+		      cacoshf(tmpf);
+		      casinhf(tmpf);
+		      catanhf(tmpf);
+		      typedef __complex__ double double_type; double_type tmpd;
+		      cacos(tmpd);
+		      casin(tmpd);
+		      catan(tmpd);
+		      cacosh(tmpd);
+		      casinh(tmpd);
+		      catanh(tmpd);
+		      typedef __complex__ long double ld_type; ld_type tmpld;
+		      cacosl(tmpld);
+		      casinl(tmpld);
+		      catanl(tmpld);
+		      cacoshl(tmpld);
+		      casinhl(tmpld);
+		      catanhl(tmpld);
+		     ],[ac_c99_complex_arc=yes], [ac_c99_complex_arc=no])
+    fi
+    AC_MSG_RESULT($ac_c99_complex_arc)
+    if test x"$ac_c99_complex_arc" = x"yes"; then
+      AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_ARC, 1,
+		[Define if C99 inverse trig functions in <complex.h> should be
+		used in <complex>. Using compiler builtins for these functions
+		requires corresponding C99 library functions to be present.])
+    fi
+
     # Check for the existence in <stdio.h> of vscanf, et. al.
     AC_CACHE_CHECK([for ISO C99 support in <stdio.h> for C++11],
       glibcxx_cv_c99_stdio_cxx11, [
diff --git a/libstdc++-v3/doc/doxygen/user.cfg.in b/libstdc++-v3/doc/doxygen/user.cfg.in
index 14981c96f95..210e13400b9 100644
--- a/libstdc++-v3/doc/doxygen/user.cfg.in
+++ b/libstdc++-v3/doc/doxygen/user.cfg.in
@@ -2352,6 +2352,7 @@ PREDEFINED             = __cplusplus=202002L \
                          _GLIBCXX_USE_NOEXCEPT=noexcept \
                          _GLIBCXX_USE_WCHAR_T \
                          _GLIBCXX_USE_LONG_LONG \
+			 _GLIBCXX_USE_C99_COMPLEX_ARC \
                          _GLIBCXX_USE_C99_STDINT_TR1 \
                          _GLIBCXX_USE_SCHED_YIELD \
                          _GLIBCXX_USE_NANOSLEEP \
diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex
index 0f5f14c3ddb..40fc062e53d 100644
--- a/libstdc++-v3/include/std/complex
+++ b/libstdc++-v3/include/std/complex
@@ -2021,7 +2021,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag());
     }
 
-#if _GLIBCXX_USE_C99_COMPLEX_TR1
+#if _GLIBCXX_USE_C99_COMPLEX_ARC
 #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
   inline __complex__ _Float16
   __complex_acos(__complex__ _Float16 __z)
@@ -2177,7 +2177,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
 #endif
 
-#if _GLIBCXX_USE_C99_COMPLEX_TR1
+#if _GLIBCXX_USE_C99_COMPLEX_ARC
   inline __complex__ float
   __complex_acos(__complex__ float __z)
   { return __builtin_cacosf(__z); }
@@ -2213,7 +2213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return std::complex<_Tp>(__t.imag(), -__t.real());
     }
 
-#if _GLIBCXX_USE_C99_COMPLEX_TR1
+#if _GLIBCXX_USE_C99_COMPLEX_ARC
   inline __complex__ float
   __complex_asin(__complex__ float __z)
   { return __builtin_casinf(__z); }
@@ -2257,7 +2257,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 			       _Tp(0.25) * log(__num / __den));
     }
 
-#if _GLIBCXX_USE_C99_COMPLEX_TR1
+#if _GLIBCXX_USE_C99_COMPLEX_ARC
   inline __complex__ float
   __complex_atan(__complex__ float __z)
   { return __builtin_catanf(__z); }
@@ -2293,7 +2293,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 				 + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0))));
     }
 
-#if _GLIBCXX_USE_C99_COMPLEX_TR1
+#if _GLIBCXX_USE_C99_COMPLEX_ARC
   inline __complex__ float
   __complex_acosh(__complex__ float __z)
   { return __builtin_cacoshf(__z); }
@@ -2332,7 +2332,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return std::log(__t + __z);
     }
 
-#if _GLIBCXX_USE_C99_COMPLEX_TR1
+#if _GLIBCXX_USE_C99_COMPLEX_ARC
   inline __complex__ float
   __complex_asinh(__complex__ float __z)
   { return __builtin_casinhf(__z); }
@@ -2376,7 +2376,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 			       _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x));
     }
 
-#if _GLIBCXX_USE_C99_COMPLEX_TR1
+#if _GLIBCXX_USE_C99_COMPLEX_ARC
   inline __complex__ float
   __complex_atanh(__complex__ float __z)
   { return __builtin_catanhf(__z); }
-- 
2.40.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [committed 2/3] libstdc++: Stop using _GLIBCXX_USE_C99_STDINT_TR1 in <cstdint>
  2023-05-16  9:11 [committed 1/3] libstdc++: Stop using _GLIBCXX_USE_C99_COMPLEX_TR1 in <complex> Jonathan Wakely
@ 2023-05-16  9:11 ` Jonathan Wakely
  2023-05-16  9:11 ` [committed 3/3] libstdc++: Stop using TR1 macros in <cctype> and <cfenv> Jonathan Wakely
  1 sibling, 0 replies; 3+ messages in thread
From: Jonathan Wakely @ 2023-05-16  9:11 UTC (permalink / raw)
  To: libstdc++, gcc-patches

Tested powerpc64le-linux. Pushed to trunk.

-- >8 --

The _GLIBCXX_USE_C99_STDINT_TR1 macro (and the comments about it in
acinclude.m4 and config.h) are misleading when it is also used for
<stdint>, not only <tr1/stdint>. It is also wrong, because the
configure checks for TR1 use -std=c++98 and a target might define
uint32_t etc. for C++11 but not for C++98.

Add a separate configure check for the <stdint.h> types using -std=c++11
for the checks. Use the result of that separate check in <cstdint> and
most other places that still depend on the macro (many uses of that
macro have been removed already). The remaining uses of the STDINT_TR1
macro are really for TR1, or are in the src/c++11/compatibility-*.cc
files, where we don't want/need to change the condition they depend on
(if those symbols were only exported when <stdint.h> types were
available for -std=c++98, then that's the condition we should continue
to use for whether to export the compat symbols now).

Make similar changes for the related _GLIBCXX_USE_C99_INTTYPES_TR1 and
_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1 macros, adding new macros for
non-TR1 uses.

libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_USE_C99): Check for <stdint.h> types in
	C++11 mode and define _GLIBCXX_USE_C99_STDINT. Check for
	<inttypes.h> features in C++11 mode and define
	_GLIBCXX_USE_C99_INTTYPES and _GLIBCXX_USE_C99_INTTYPES_WCHAR_T.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* doc/doxygen/user.cfg.in (PREDEFINED): Add new macros.
	* include/bits/chrono.h: Check _GLIBCXX_USE_C99_STDINT instead
	of _GLIBCXX_USE_C99_STDINT_TR1.
	* include/c_compatibility/inttypes.h: Check
	_GLIBCXX_USE_C99_INTTYPES and _GLIBCXX_USE_C99_INTTYPES_WCHAR_T
	instead of _GLIBCXX_USE_C99_INTTYPES_TR1 and
	_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1.
	* include/c_compatibility/stdatomic.h: Check
	_GLIBCXX_USE_C99_STDINT instead of _GLIBCXX_USE_C99_STDINT_TR1.
	* include/c_compatibility/stdint.h: Likewise.
	* include/c_global/cinttypes: Check _GLIBCXX_USE_C99_INTTYPES
	and _GLIBCXX_USE_C99_INTTYPES_WCHAR_T instead of
	_GLIBCXX_USE_C99_INTTYPES_TR1 and
	_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1.
	* include/c_global/cstdint: Check _GLIBCXX_USE_C99_STDINT
	instead of _GLIBCXX_USE_C99_STDINT_TR1.
	* include/std/atomic: Likewise.
	* src/c++11/cow-stdexcept.cc: Likewise.
	* testsuite/29_atomics/headers/stdatomic.h/c_compat.cc:
	Likewise.
	* testsuite/lib/libstdc++.exp (check_v3_target_cstdint):
	Likewise.
---
 libstdc++-v3/acinclude.m4                     | 142 +++++++++++++
 libstdc++-v3/config.h.in                      |  12 ++
 libstdc++-v3/configure                        | 196 ++++++++++++++++++
 libstdc++-v3/doc/doxygen/user.cfg.in          |   3 +
 libstdc++-v3/include/bits/chrono.h            |   2 +-
 .../include/c_compatibility/inttypes.h        |   6 +-
 .../include/c_compatibility/stdatomic.h       |   4 +-
 libstdc++-v3/include/c_compatibility/stdint.h |   4 +-
 libstdc++-v3/include/c_global/cinttypes       |   6 +-
 libstdc++-v3/include/c_global/cstdint         |   6 +-
 libstdc++-v3/include/std/atomic               |   2 +-
 libstdc++-v3/src/c++11/cow-stdexcept.cc       |   4 +-
 .../headers/stdatomic.h/c_compat.cc           |   2 +-
 libstdc++-v3/testsuite/lib/libstdc++.exp      |   2 +-
 14 files changed, 372 insertions(+), 19 deletions(-)

diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 84b12adbc24..0c01b526ebf 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -1103,6 +1103,148 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
       ])
     fi
 
+    # Check for the existence of <stdint.h> types.
+    AC_CACHE_CHECK([for ISO C99 support in <stdint.h> for C++11],
+    glibcxx_cv_c99_stdint, [
+    AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
+		    #define __STDC_CONSTANT_MACROS
+		    #include <stdint.h>],
+		   [typedef int8_t          my_int8_t;
+		    my_int8_t               i8 = INT8_MIN;
+		    i8 = INT8_MAX;
+		    typedef int16_t         my_int16_t;
+		    my_int16_t              i16 = INT16_MIN;
+		    i16 = INT16_MAX;
+		    typedef int32_t         my_int32_t;
+		    my_int32_t              i32 = INT32_MIN;
+		    i32 = INT32_MAX;
+		    typedef int64_t         my_int64_t;
+		    my_int64_t              i64 = INT64_MIN;
+		    i64 = INT64_MAX;
+		    typedef int_fast8_t     my_int_fast8_t;
+		    my_int_fast8_t          if8 = INT_FAST8_MIN;
+		    if8 = INT_FAST8_MAX;
+		    typedef int_fast16_t    my_int_fast16_t;
+		    my_int_fast16_t         if16 = INT_FAST16_MIN;
+		    if16 = INT_FAST16_MAX;
+		    typedef int_fast32_t    my_int_fast32_t;
+		    my_int_fast32_t         if32 = INT_FAST32_MIN;
+		    if32 = INT_FAST32_MAX;
+		    typedef int_fast64_t    my_int_fast64_t;
+		    my_int_fast64_t         if64 = INT_FAST64_MIN;
+		    if64 = INT_FAST64_MAX;
+		    typedef int_least8_t    my_int_least8_t;
+		    my_int_least8_t         il8 = INT_LEAST8_MIN;
+		    il8 = INT_LEAST8_MAX;
+		    typedef int_least16_t   my_int_least16_t;
+		    my_int_least16_t        il16 = INT_LEAST16_MIN;
+		    il16 = INT_LEAST16_MAX;
+		    typedef int_least32_t   my_int_least32_t;
+		    my_int_least32_t        il32 = INT_LEAST32_MIN;
+		    il32 = INT_LEAST32_MAX;
+		    typedef int_least64_t   my_int_least64_t;
+		    my_int_least64_t        il64 = INT_LEAST64_MIN;
+		    il64 = INT_LEAST64_MAX;
+		    typedef intmax_t        my_intmax_t;
+		    my_intmax_t             im = INTMAX_MAX;
+		    im = INTMAX_MIN;
+		    typedef intptr_t        my_intptr_t;
+		    my_intptr_t             ip = INTPTR_MAX;
+		    ip = INTPTR_MIN;
+		    typedef uint8_t         my_uint8_t;
+		    my_uint8_t              ui8 = UINT8_MAX;
+		    ui8 = UINT8_MAX;
+		    typedef uint16_t        my_uint16_t;
+		    my_uint16_t             ui16 = UINT16_MAX;
+		    ui16 = UINT16_MAX;
+		    typedef uint32_t        my_uint32_t;
+		    my_uint32_t             ui32 = UINT32_MAX;
+		    ui32 = UINT32_MAX;
+		    typedef uint64_t        my_uint64_t;
+		    my_uint64_t             ui64 = UINT64_MAX;
+		    ui64 = UINT64_MAX;
+		    typedef uint_fast8_t    my_uint_fast8_t;
+		    my_uint_fast8_t         uif8 = UINT_FAST8_MAX;
+		    uif8 = UINT_FAST8_MAX;
+		    typedef uint_fast16_t   my_uint_fast16_t;
+		    my_uint_fast16_t        uif16 = UINT_FAST16_MAX;
+		    uif16 = UINT_FAST16_MAX;
+		    typedef uint_fast32_t   my_uint_fast32_t;
+		    my_uint_fast32_t        uif32 = UINT_FAST32_MAX;
+		    uif32 = UINT_FAST32_MAX;
+		    typedef uint_fast64_t   my_uint_fast64_t;
+		    my_uint_fast64_t        uif64 = UINT_FAST64_MAX;
+		    uif64 = UINT_FAST64_MAX;
+		    typedef uint_least8_t   my_uint_least8_t;
+		    my_uint_least8_t        uil8 = UINT_LEAST8_MAX;
+		    uil8 = UINT_LEAST8_MAX;
+		    typedef uint_least16_t  my_uint_least16_t;
+		    my_uint_least16_t       uil16 = UINT_LEAST16_MAX;
+		    uil16 = UINT_LEAST16_MAX;
+		    typedef uint_least32_t  my_uint_least32_t;
+		    my_uint_least32_t       uil32 = UINT_LEAST32_MAX;
+		    uil32 = UINT_LEAST32_MAX;
+		    typedef uint_least64_t  my_uint_least64_t;
+		    my_uint_least64_t       uil64 = UINT_LEAST64_MAX;
+		    uil64 = UINT_LEAST64_MAX;
+		    typedef uintmax_t       my_uintmax_t;
+		    my_uintmax_t            uim = UINTMAX_MAX;
+		    uim = UINTMAX_MAX;
+		    typedef uintptr_t       my_uintptr_t;
+		    my_uintptr_t            uip = UINTPTR_MAX;
+		    uip = UINTPTR_MAX;
+		   ],[glibcxx_cv_c99_stdint=yes],
+		     [glibcxx_cv_c99_stdint=no])
+    ])
+    if test x"$glibcxx_cv_c99_stdint" = x"yes"; then
+      AC_DEFINE(_GLIBCXX_USE_C99_STDINT, 1,
+		[Define if C99 types in <stdint.h> should be imported in
+		<cstdint> in namespace std for C++11.])
+    fi
+
+    # Check for the existence of <inttypes.h> functions (NB: doesn't make
+    # sense if the glibcxx_cv_c99_stdint check fails, per C99, 7.8/1).
+    ac_c99_inttypes=no;
+    if test x"$glibcxx_cv_c99_stdint" = x"yes"; then
+      AC_MSG_CHECKING([for ISO C99 support for C++11 in <inttypes.h>])
+      AC_TRY_COMPILE([#include <inttypes.h>],
+		     [intmax_t i, numer, denom, base;
+		      const char* s;
+		      char** endptr;
+		      intmax_t ret = imaxabs(i);
+		      imaxdiv_t dret = imaxdiv(numer, denom);
+		      ret = strtoimax(s, endptr, base);
+		      uintmax_t uret = strtoumax(s, endptr, base);
+		     ],[ac_c99_inttypes=yes], [ac_c99_inttypes=no])
+      AC_MSG_RESULT($ac_c99_inttypes)
+    fi
+    if test x"$ac_c99_inttypes" = x"yes"; then
+      AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES, 1,
+		[Define if C99 functions in <inttypes.h> should be imported in
+		<cinttypes> in namespace std in C++11.])
+    fi
+
+    # Check for the existence of wchar_t <inttypes.h> functions (NB: doesn't
+    # make sense if the glibcxx_cv_c99_stdint check fails, per C99, 7.8/1).
+    ac_c99_inttypes_wchar_t=no;
+    if test x"$glibcxx_cv_c99_stdint" = x"yes"; then
+      AC_MSG_CHECKING([for wchar_t ISO C99 support for C++11 in <inttypes.h>])
+      AC_TRY_COMPILE([#include <inttypes.h>],
+		     [intmax_t base;
+		      const wchar_t* s;
+		      wchar_t** endptr;
+		      intmax_t ret = wcstoimax(s, endptr, base);
+		      uintmax_t uret = wcstoumax(s, endptr, base);
+		     ],[ac_c99_inttypes_wchar_t=yes],
+		       [ac_c99_inttypes_wchar_t=no])
+      AC_MSG_RESULT($ac_c99_inttypes_wchar_t)
+    fi
+    if test x"$ac_c99_inttypes_wchar_t" = x"yes"; then
+      AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_WCHAR_T, 1,
+		[Define if wchar_t C99 functions in <inttypes.h> should be
+		imported in <cinttypes> in namespace std in C++11.])
+    fi
+
     # Check for the existence of <math.h> functions used if C99 is enabled.
     AC_CACHE_CHECK([for ISO C99 support in <math.h> for C++11],
     glibcxx_cv_c99_math_cxx11, [
diff --git a/libstdc++-v3/doc/doxygen/user.cfg.in b/libstdc++-v3/doc/doxygen/user.cfg.in
index 210e13400b9..0905e0f48f2 100644
--- a/libstdc++-v3/doc/doxygen/user.cfg.in
+++ b/libstdc++-v3/doc/doxygen/user.cfg.in
@@ -2353,6 +2353,9 @@ PREDEFINED             = __cplusplus=202002L \
                          _GLIBCXX_USE_WCHAR_T \
                          _GLIBCXX_USE_LONG_LONG \
 			 _GLIBCXX_USE_C99_COMPLEX_ARC \
+			 _GLIBCXX_USE_C99_INTTYPES \
+			 _GLIBCXX_USE_C99_INTTYPES_WCHAR_T \
+                         _GLIBCXX_USE_C99_STDINT \
                          _GLIBCXX_USE_C99_STDINT_TR1 \
                          _GLIBCXX_USE_SCHED_YIELD \
                          _GLIBCXX_USE_NANOSLEEP \
diff --git a/libstdc++-v3/include/bits/chrono.h b/libstdc++-v3/include/bits/chrono.h
index fb99fe5eed7..81b92d724f7 100644
--- a/libstdc++-v3/include/bits/chrono.h
+++ b/libstdc++-v3/include/bits/chrono.h
@@ -884,7 +884,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     /// @}
 
     /// @cond undocumented
-#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+#ifdef _GLIBCXX_USE_C99_STDINT
 # define _GLIBCXX_CHRONO_INT64_T int64_t
 #elif defined __INT64_TYPE__
 # define _GLIBCXX_CHRONO_INT64_T __INT64_TYPE__
diff --git a/libstdc++-v3/include/c_compatibility/inttypes.h b/libstdc++-v3/include/c_compatibility/inttypes.h
index 9c2b7d6c68d..070fcbcc1f2 100644
--- a/libstdc++-v3/include/c_compatibility/inttypes.h
+++ b/libstdc++-v3/include/c_compatibility/inttypes.h
@@ -48,7 +48,7 @@
 #  endif
 # endif
 
-#ifdef _GLIBCXX_USE_C99_INTTYPES_TR1
+#ifdef _GLIBCXX_USE_C99_INTTYPES
 
 namespace std
 {
@@ -72,13 +72,13 @@ namespace std
   using ::strtoimax;
   using ::strtoumax;
 
-#if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1
+#if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_INTTYPES_WCHAR_T
   using ::wcstoimax;
   using ::wcstoumax;
 #endif
 } // namespace
 
-#endif _GLIBCXX_USE_C99_INTTYPES_TR1
+#endif _GLIBCXX_USE_C99_INTTYPES
 
 #else
 
diff --git a/libstdc++-v3/include/c_compatibility/stdatomic.h b/libstdc++-v3/include/c_compatibility/stdatomic.h
index b565a1c1ab1..0b633262d08 100644
--- a/libstdc++-v3/include/c_compatibility/stdatomic.h
+++ b/libstdc++-v3/include/c_compatibility/stdatomic.h
@@ -62,7 +62,7 @@ using std::atomic_char8_t;
 using std::atomic_char16_t;
 using std::atomic_char32_t;
 using std::atomic_wchar_t;
-#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+#ifdef _GLIBCXX_USE_C99_STDINT
 using std::atomic_int8_t;
 using std::atomic_uint8_t;
 using std::atomic_int16_t;
@@ -92,7 +92,7 @@ using std::atomic_intptr_t;
 using std::atomic_uintptr_t;
 using std::atomic_size_t;
 using std::atomic_ptrdiff_t;
-#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+#ifdef _GLIBCXX_USE_C99_STDINT
 using std::atomic_intmax_t;
 using std::atomic_uintmax_t;
 #endif
diff --git a/libstdc++-v3/include/c_compatibility/stdint.h b/libstdc++-v3/include/c_compatibility/stdint.h
index c264e979a0a..85948a5ada1 100644
--- a/libstdc++-v3/include/c_compatibility/stdint.h
+++ b/libstdc++-v3/include/c_compatibility/stdint.h
@@ -56,7 +56,7 @@
 #  endif
 # endif
 
-#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+#ifdef _GLIBCXX_USE_C99_STDINT
 
 namespace std
 {
@@ -97,7 +97,7 @@ namespace std
   using ::uintptr_t;
 } // namespace
 
-#endif // _GLIBCXX_USE_C99_STDINT_TR1
+#endif // _GLIBCXX_USE_C99_STDINT
 
 #else
 
diff --git a/libstdc++-v3/include/c_global/cinttypes b/libstdc++-v3/include/c_global/cinttypes
index 8a9de63af79..06fc34d7d6e 100644
--- a/libstdc++-v3/include/c_global/cinttypes
+++ b/libstdc++-v3/include/c_global/cinttypes
@@ -50,7 +50,7 @@
 # endif
 #endif
 
-#ifdef _GLIBCXX_USE_C99_INTTYPES_TR1
+#ifdef _GLIBCXX_USE_C99_INTTYPES
 
 namespace std
 {
@@ -68,13 +68,13 @@ namespace std
   using ::strtoimax;
   using ::strtoumax;
 
-#if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1
+#if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_INTTYPES_WCHAR_T
   using ::wcstoimax;
   using ::wcstoumax;
 #endif
 } // namespace std
 
-#endif // _GLIBCXX_USE_C99_INTTYPES_TR1
+#endif // _GLIBCXX_USE_C99_INTTYPES
 
 #endif // C++11
 
diff --git a/libstdc++-v3/include/c_global/cstdint b/libstdc++-v3/include/c_global/cstdint
index 64e8574badc..97a30d5e004 100644
--- a/libstdc++-v3/include/c_global/cstdint
+++ b/libstdc++-v3/include/c_global/cstdint
@@ -47,7 +47,7 @@
 
 namespace std
 {
-#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+#ifdef _GLIBCXX_USE_C99_STDINT
   using ::int8_t;
   using ::int16_t;
   using ::int32_t;
@@ -83,7 +83,7 @@ namespace std
 
   using ::uintmax_t;
   using ::uintptr_t;
-#else // !_GLIBCXX_USE_C99_STDINT_TR1
+#else // !_GLIBCXX_USE_C99_STDINT
 
   using intmax_t = __INTMAX_TYPE__;
   using uintmax_t = __UINTMAX_TYPE__;
@@ -138,7 +138,7 @@ namespace std
   using uintptr_t = __UINTPTR_TYPE__;
 #endif
 
-#endif // _GLIBCXX_USE_C99_STDINT_TR1
+#endif // _GLIBCXX_USE_C99_STDINT
 } // namespace std
 
 #endif // C++11
diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic
index b502027e4a4..111df2a978b 100644
--- a/libstdc++-v3/include/std/atomic
+++ b/libstdc++-v3/include/std/atomic
@@ -1103,7 +1103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   /// atomic_char32_t
   typedef atomic<char32_t>		atomic_char32_t;
 
-#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+#ifdef _GLIBCXX_USE_C99_STDINT
   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   // 2441. Exact-width atomic typedefs should be provided
 
diff --git a/libstdc++-v3/src/c++11/cow-stdexcept.cc b/libstdc++-v3/src/c++11/cow-stdexcept.cc
index 652f248a54e..8d1cc4605d4 100644
--- a/libstdc++-v3/src/c++11/cow-stdexcept.cc
+++ b/libstdc++-v3/src/c++11/cow-stdexcept.cc
@@ -198,7 +198,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
 // declared transaction-safe, so we just don't provide transactional clones
 // in this case.
 #if _GLIBCXX_USE_WEAK_REF
-#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+#ifdef _GLIBCXX_USE_C99_STDINT
 
 #include <stdint.h>
 
@@ -461,5 +461,5 @@ CTORDTOR(15underflow_error, std::underflow_error, runtime_error)
 
 }
 
-#endif  // _GLIBCXX_USE_C99_STDINT_TR1
+#endif  // _GLIBCXX_USE_C99_STDINT
 #endif  // _GLIBCXX_USE_WEAK_REF
diff --git a/libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc b/libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc
index 8dd7054a997..3364c60a225 100644
--- a/libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc
+++ b/libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc
@@ -70,7 +70,7 @@ static_assert(is_same<atomic_char32_t, _Atomic(char32_t)>);
 static_assert(is_same<atomic_wchar_t,  _Atomic(wchar_t)>);
 
 #include <stdint.h>
-#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+#ifdef _GLIBCXX_USE_C99_STDINT
 static_assert(is_same<atomic_int8_t,   _Atomic(int8_t)>);
 static_assert(is_same<atomic_uint8_t,  _Atomic(uint8_t)>);
 static_assert(is_same<atomic_int16_t,  _Atomic(int16_t)>);
diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
index 490abd108fa..7d9471a1ded 100644
--- a/libstdc++-v3/testsuite/lib/libstdc++.exp
+++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
@@ -1063,7 +1063,7 @@ proc check_v3_target_parallel_mode { } {
 # Return 1 if the C99 stdint facilities are available, 0 otherwise.
 proc check_v3_target_cstdint { } {
     return [check_v3_target_prop_cached et_cstdint {
-	set cond "defined _GLIBCXX_USE_C99_STDINT_TR1"
+	set cond "defined _GLIBCXX_USE_C99_STDINT"
 	return [v3_check_preprocessor_condition cstdint $cond]
     }]
 }
-- 
2.40.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [committed 3/3] libstdc++: Stop using TR1 macros in <cctype> and <cfenv>
  2023-05-16  9:11 [committed 1/3] libstdc++: Stop using _GLIBCXX_USE_C99_COMPLEX_TR1 in <complex> Jonathan Wakely
  2023-05-16  9:11 ` [committed 2/3] libstdc++: Stop using _GLIBCXX_USE_C99_STDINT_TR1 in <cstdint> Jonathan Wakely
@ 2023-05-16  9:11 ` Jonathan Wakely
  1 sibling, 0 replies; 3+ messages in thread
From: Jonathan Wakely @ 2023-05-16  9:11 UTC (permalink / raw)
  To: libstdc++, gcc-patches

Tested powerpc64le-linux. Pushed to trunk.

-- >8 --

As with the two commits before this, the _GLIBCXX_USE_C99_CTYPE_TR1 and
_GLIBCXX_USE_C99_FENV_TR1 macros are misleading when they are also used
for <cctype> and <cfenv>, not only for TR1 headers. It is also wrong,
because the configure checks for TR1 use -std=c++98 and a target might
define the C99 features for C++11 but not for C++98.

Add separate configure checks for the <ctype.h> and <fenv.h> features using -std=c++11
for the checks. Use the new macros defined by those checks in the
C++11-specific parts of <cctype>, <cfenv>, and <fenv.h>.

libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_USE_C99): Check for isblank in C++11
	mode and define _GLIBCXX_USE_C99_CTYPE. Check for <fenv.h>
	functions in C++11 mode and define _GLIBCXX_USE_C99_FENV.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* include/c_compatibility/fenv.h: Check _GLIBCXX_USE_C99_FENV
	instead of _GLIBCXX_USE_C99_FENV_TR1.
	* include/c_global/cfenv: Likewise.
	* include/c_global/cctype: Check _GLIBCXX_USE_C99_CTYPE instead
	of _GLIBCXX_USE_C99_CTYPE_TR1.
---
 libstdc++-v3/acinclude.m4                   | 46 ++++++++++
 libstdc++-v3/config.h.in                    |  8 ++
 libstdc++-v3/configure                      | 97 +++++++++++++++++++++
 libstdc++-v3/include/c_compatibility/fenv.h |  4 +-
 libstdc++-v3/include/c_global/cctype        |  4 +-
 libstdc++-v3/include/c_global/cfenv         |  4 +-
 6 files changed, 157 insertions(+), 6 deletions(-)

diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 0c01b526ebf..988c532c4e2 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -1476,6 +1476,52 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
       fi
     fi
 
+    # Check for the existence of <ctype.h> functions.
+    AC_CACHE_CHECK([for ISO C99 support for C++11 in <ctype.h>],
+    glibcxx_cv_c99_ctype, [
+    AC_TRY_COMPILE([#include <ctype.h>],
+		   [int ch;
+		    int ret;
+		    ret = isblank(ch);
+		   ],[glibcxx_cv_c99_ctype=yes],
+		     [glibcxx_cv_c99_ctype=no])
+    ])
+    if test x"$glibcxx_cv_c99_ctype" = x"yes"; then
+      AC_DEFINE(_GLIBCXX_USE_C99_CTYPE, 1,
+		[Define if C99 functions in <ctype.h> should be imported in
+		<cctype> in namespace std for C++11.])
+    fi
+
+    # Check for the existence of <fenv.h> functions.
+    AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
+    ac_c99_fenv=no;
+    if test x"$ac_has_fenv_h" = x"yes"; then
+      AC_MSG_CHECKING([for ISO C99 support for C++11 in <fenv.h>])
+      AC_TRY_COMPILE([#include <fenv.h>],
+		     [int except, mode;
+		      fexcept_t* pflag;
+		      fenv_t* penv;
+		      int ret;
+		      ret = feclearexcept(except);
+		      ret = fegetexceptflag(pflag, except);
+		      ret = feraiseexcept(except);
+		      ret = fesetexceptflag(pflag, except);
+		      ret = fetestexcept(except);
+		      ret = fegetround();
+		      ret = fesetround(mode);
+		      ret = fegetenv(penv);
+		      ret = feholdexcept(penv);
+		      ret = fesetenv(penv);
+		      ret = feupdateenv(penv);
+		     ],[ac_c99_fenv=yes], [ac_c99_fenv=no])
+      AC_MSG_RESULT($ac_c99_fenv)
+    fi
+    if test x"$ac_c99_fenv" = x"yes"; then
+      AC_DEFINE(_GLIBCXX_USE_C99_FENV, 1,
+		[Define if C99 functions in <fenv.h> should be imported in
+		<cfenv> in namespace std for C++11.])
+    fi
+
     gcc_no_link="$ac_save_gcc_no_link"
     LIBS="$ac_save_LIBS"
     CXXFLAGS="$ac_save_CXXFLAGS"
diff --git a/libstdc++-v3/include/c_compatibility/fenv.h b/libstdc++-v3/include/c_compatibility/fenv.h
index 70ce3f834f4..83e930f12d1 100644
--- a/libstdc++-v3/include/c_compatibility/fenv.h
+++ b/libstdc++-v3/include/c_compatibility/fenv.h
@@ -38,7 +38,7 @@
 
 #if __cplusplus >= 201103L
 
-#if _GLIBCXX_USE_C99_FENV_TR1
+#if _GLIBCXX_USE_C99_FENV
 
 #undef feclearexcept
 #undef fegetexceptflag
@@ -74,7 +74,7 @@ namespace std
   using ::feupdateenv;
 } // namespace
 
-#endif // _GLIBCXX_USE_C99_FENV_TR1
+#endif // _GLIBCXX_USE_C99_FENV
 
 #endif // C++11
 
diff --git a/libstdc++-v3/include/c_global/cctype b/libstdc++-v3/include/c_global/cctype
index bd667fba15d..e6ff1204df6 100644
--- a/libstdc++-v3/include/c_global/cctype
+++ b/libstdc++-v3/include/c_global/cctype
@@ -78,7 +78,7 @@ namespace std
 
 #if __cplusplus >= 201103L
 
-#ifdef _GLIBCXX_USE_C99_CTYPE_TR1
+#ifdef _GLIBCXX_USE_C99_CTYPE
 
 #undef isblank
 
@@ -87,7 +87,7 @@ namespace std
   using ::isblank;
 } // namespace std
 
-#endif // _GLIBCXX_USE_C99_CTYPE_TR1
+#endif // _GLIBCXX_USE_C99_CTYPE
 
 #endif // C++11
 
diff --git a/libstdc++-v3/include/c_global/cfenv b/libstdc++-v3/include/c_global/cfenv
index 6704dc5423e..3a1d9c4a6aa 100644
--- a/libstdc++-v3/include/c_global/cfenv
+++ b/libstdc++-v3/include/c_global/cfenv
@@ -41,7 +41,7 @@
 # include <fenv.h>
 #endif
 
-#ifdef _GLIBCXX_USE_C99_FENV_TR1
+#ifdef _GLIBCXX_USE_C99_FENV
 
 #undef feclearexcept
 #undef fegetexceptflag
@@ -77,7 +77,7 @@ namespace std
   using ::feupdateenv;
 } // namespace std
 
-#endif // _GLIBCXX_USE_C99_FENV_TR1
+#endif // _GLIBCXX_USE_C99_FENV
 
 #endif // C++11
 
-- 
2.40.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-05-16  9:11 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-16  9:11 [committed 1/3] libstdc++: Stop using _GLIBCXX_USE_C99_COMPLEX_TR1 in <complex> Jonathan Wakely
2023-05-16  9:11 ` [committed 2/3] libstdc++: Stop using _GLIBCXX_USE_C99_STDINT_TR1 in <cstdint> Jonathan Wakely
2023-05-16  9:11 ` [committed 3/3] libstdc++: Stop using TR1 macros in <cctype> and <cfenv> Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).