[PATCH] libstdc++: Use constexpr-if for C++11 and C++14

Jonathan Wakely jwakely@redhat.com
Tue Apr 29 09:02:41 GMT 2025


Replace remaining uses of _GLIBCXX17_CONSTEXPR for constexpr-if, so that
we always use constexpr-if in C++11 and C++14. Diagnostic pragmas are
used to suppress diagnostics.

libstdc++-v3/ChangeLog:

	* include/bits/char_traits.h (char_traits::assign): Use
	constexpr-if unconditionally for C++11 and C++14.
	* include/bits/locale_conv.h (__do_str_codecvt): Likewise.
	* include/bits/ostream.h (basic_ostream::_S_cast_flt): Likewise.
	* include/bits/random.tcc (shuffle_order_engine::operator())
	(seed_seq::seed_seq(Iter, Iter)): Likewise.
	* include/bits/shared_ptr_base.h (_Sp_counted_base::_M_release):
	Likewise.
	* include/bits/stl_tree.h (_Rb_tree::_M_move_data): Likewise.
	* include/bits/uniform_int_dist.h
	(uniform_int_distribution::operator()): Likewise.
	* include/bits/valarray_array.h (__valarray_default_construct)
	(__valarray_fill_construct, __valarray_copy_construct)
	(__valarray_copy_construct, __valarray_destroy_elements):
	Likewise.
	* include/experimental/numeric (lcm): Likewise.
	* include/std/bit (__rotl, __rotr, __countl_zero, __countr_zero)
	(__popcount, __bit_ceil) Likewise.:
	* include/std/bitset (operator>>): Likewise.
	* include/std/charconv (__to_chars_8, __to_chars_i)
	(__from_chars_alnum_to_val, from_chars): Likewise.
	* include/tr2/dynamic_bitset (__dynamic_bitset_base): Likewise.
	* testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error
	line number.
---

Tested x86_64-linux.

 libstdc++-v3/include/bits/char_traits.h       |  5 +++-
 libstdc++-v3/include/bits/locale_conv.h       |  7 +++--
 libstdc++-v3/include/bits/ostream.h           |  4 +--
 libstdc++-v3/include/bits/random.tcc          | 10 +++++--
 libstdc++-v3/include/bits/shared_ptr_base.h   |  5 +++-
 libstdc++-v3/include/bits/stl_tree.h          |  5 +++-
 libstdc++-v3/include/bits/uniform_int_dist.h  |  7 +++--
 libstdc++-v3/include/bits/valarray_array.h    | 15 +++++++----
 libstdc++-v3/include/experimental/numeric     |  5 +++-
 libstdc++-v3/include/std/bit                  | 27 ++++++++++---------
 libstdc++-v3/include/std/bitset               | 12 ++++++---
 libstdc++-v3/include/std/charconv             | 15 ++++++-----
 libstdc++-v3/include/tr2/dynamic_bitset       | 10 +++++--
 .../26_numerics/random/pr60037-neg.cc         |  2 +-
 14 files changed, 87 insertions(+), 42 deletions(-)

diff --git a/libstdc++-v3/include/bits/char_traits.h b/libstdc++-v3/include/bits/char_traits.h
index 67e18e89784..5ca34669302 100644
--- a/libstdc++-v3/include/bits/char_traits.h
+++ b/libstdc++-v3/include/bits/char_traits.h
@@ -284,7 +284,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
 #endif
 
-      if _GLIBCXX17_CONSTEXPR (sizeof(_CharT) == 1 && __is_trivial(_CharT))
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+      if _GLIBCXX_CONSTEXPR (sizeof(_CharT) == 1 && __is_trivial(_CharT))
 	{
 	  if (__n)
 	    {
@@ -298,6 +300,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  for (std::size_t __i = 0; __i < __n; ++__i)
 	    __s[__i] = __a;
 	}
+#pragma GCC diagnostic pop
       return __s;
     }
 
diff --git a/libstdc++-v3/include/bits/locale_conv.h b/libstdc++-v3/include/bits/locale_conv.h
index 076e14ff762..b08795dcaf5 100644
--- a/libstdc++-v3/include/bits/locale_conv.h
+++ b/libstdc++-v3/include/bits/locale_conv.h
@@ -85,16 +85,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  return false;
 	}
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
       // The codecvt facet will only return noconv when the types are
       // the same, so avoid instantiating basic_string::assign otherwise
-      if _GLIBCXX17_CONSTEXPR (is_same<typename _Codecvt::intern_type,
-				       typename _Codecvt::extern_type>())
+      if constexpr (is_same<typename _Codecvt::intern_type,
+			    typename _Codecvt::extern_type>::value)
 	if (__result == codecvt_base::noconv)
 	  {
 	    __outstr.assign(__first, __last);
 	    __count = __last - __first;
 	    return true;
 	  }
+#pragma GCC diagnostic pop
 
       __outstr.resize(__outchars);
       __count = __next - __first;
diff --git a/libstdc++-v3/include/bits/ostream.h b/libstdc++-v3/include/bits/ostream.h
index d19a76ab247..caa47bead4b 100644
--- a/libstdc++-v3/include/bits/ostream.h
+++ b/libstdc++-v3/include/bits/ostream.h
@@ -499,9 +499,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
 	  __sign = __builtin_signbit(__f) ? _To(-1.0) : _To(+1.0);
 
-	  if _GLIBCXX17_CONSTEXPR (__is_same(_To, double))
+	  if _GLIBCXX_CONSTEXPR (__is_same(_To, double))
 	    __d = __builtin_copysign(__d, __sign);
-	  else if _GLIBCXX17_CONSTEXPR (__is_same(_To, long double))
+	  else if _GLIBCXX_CONSTEXPR (__is_same(_To, long double))
 	    __d = __builtin_copysignl(__d, __sign);
 #endif
 	  return __d;
diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc
index 752d707a5e4..53ccacb2e38 100644
--- a/libstdc++-v3/include/bits/random.tcc
+++ b/libstdc++-v3/include/bits/random.tcc
@@ -849,11 +849,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr result_type __range = max() - min();
       size_t __j = __k;
       const result_type __y = _M_y - min();
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
       // Avoid using slower long double arithmetic if possible.
-      if _GLIBCXX17_CONSTEXPR (__detail::__p1_representable_as_double(__range))
+      if constexpr (__detail::__p1_representable_as_double(__range))
 	__j *= __y / (__range + 1.0);
       else
 	__j *= __y / (__range + 1.0L);
+#pragma GCC diagnostic pop
       _M_y = _M_v[__j];
       _M_v[__j] = _M_b();
 
@@ -3244,8 +3247,11 @@ namespace __detail
   template<typename _InputIterator>
     seed_seq::seed_seq(_InputIterator __begin, _InputIterator __end)
     {
-      if _GLIBCXX17_CONSTEXPR (__is_random_access_iter<_InputIterator>::value)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+      if constexpr (__is_random_access_iter<_InputIterator>::value)
 	_M_v.reserve(std::distance(__begin, __end));
+#pragma GCC diagnostic pop
 
       for (_InputIterator __iter = __begin; __iter != __end; ++__iter)
 	_M_v.push_back(__detail::__mod<result_type,
diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h
index 3622e029117..b4be1b49e4d 100644
--- a/libstdc++-v3/include/bits/shared_ptr_base.h
+++ b/libstdc++-v3/include/bits/shared_ptr_base.h
@@ -315,6 +315,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline void
     _Sp_counted_base<_S_atomic>::_M_release() noexcept
     {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
       _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_use_count);
 #if ! _GLIBCXX_TSAN
       constexpr bool __lock_free
@@ -325,7 +327,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       // The ref-count members follow the vptr, so are aligned to
       // alignof(void*).
       constexpr bool __aligned = __alignof(long long) <= alignof(void*);
-      if _GLIBCXX17_CONSTEXPR (__lock_free && __double_word && __aligned)
+      if constexpr (__lock_free && __double_word && __aligned)
 	{
 	  constexpr int __wordbits = __CHAR_BIT__ * sizeof(_Atomic_word);
 	  constexpr int __shiftbits = __double_word ? __wordbits : 0;
@@ -359,6 +361,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	{
 	  _M_release_last_use();
 	}
+#pragma GCC diagnostic pop
     }
 
   template<>
diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h
index 6caf937cca9..6c12c41bba7 100644
--- a/libstdc++-v3/include/bits/stl_tree.h
+++ b/libstdc++-v3/include/bits/stl_tree.h
@@ -2340,8 +2340,11 @@ namespace __rb_tree
 	  constexpr bool __move = !__move_if_noexcept_cond<value_type>::value;
 	  _Alloc_node __an(*this);
 	  _M_root() = _M_copy<__move>(__x, __an);
-	  if _GLIBCXX17_CONSTEXPR (__move)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+	  if constexpr (__move)
 	    __x.clear();
+#pragma GCC diagnostic pop
 	}
     }
 
diff --git a/libstdc++-v3/include/bits/uniform_int_dist.h b/libstdc++-v3/include/bits/uniform_int_dist.h
index d96dcbd89c0..77b1e96bd8f 100644
--- a/libstdc++-v3/include/bits/uniform_int_dist.h
+++ b/libstdc++-v3/include/bits/uniform_int_dist.h
@@ -308,9 +308,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 	    const __uctype __uerange = __urange + 1; // __urange can be zero
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
 #if defined __UINT64_TYPE__ && defined __UINT32_TYPE__
 #if __SIZEOF_INT128__
-	    if _GLIBCXX17_CONSTEXPR (__urngrange == __UINT64_MAX__)
+	    if constexpr (__urngrange == __UINT64_MAX__)
 	      {
 		// __urng produces values that use exactly 64-bits,
 		// so use 128-bit integers to downscale to desired range.
@@ -320,7 +322,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	      }
 	    else
 #endif
-	    if _GLIBCXX17_CONSTEXPR (__urngrange == __UINT32_MAX__)
+	    if constexpr (__urngrange == __UINT32_MAX__)
 	      {
 		// __urng produces values that use exactly 32-bits,
 		// so use 64-bit integers to downscale to desired range.
@@ -338,6 +340,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 		while (__ret >= __past);
 		__ret /= __scaling;
 	      }
+#pragma GCC diagnostic pop
 	  }
 	else if (__urngrange < __urange)
 	  {
diff --git a/libstdc++-v3/include/bits/valarray_array.h b/libstdc++-v3/include/bits/valarray_array.h
index 03b6f1e0a68..b5c02b77b10 100644
--- a/libstdc++-v3/include/bits/valarray_array.h
+++ b/libstdc++-v3/include/bits/valarray_array.h
@@ -64,13 +64,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   __valarray_release_memory(void* __p)
   { operator delete(__p); }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+
   // Turn raw-memory into an array of _Tp filled with _Tp().
   // This is used in `valarray<T> v(n);` and in `valarray<T>::shift(n)`.
   template<typename _Tp>
     inline void
     __valarray_default_construct(_Tp* __b, _Tp* __e)
     {
-      if _GLIBCXX17_CONSTEXPR (__is_trivial(_Tp))
+      if _GLIBCXX_CONSTEXPR (__is_trivial(_Tp))
 	__builtin_memset(__b, 0, (__e - __b) * sizeof(_Tp));
       else
 	while (__b != __e)
@@ -94,7 +97,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     __valarray_copy_construct(const _Tp* __b, const _Tp* __e,
 			      _Tp* __restrict__ __o)
     {
-      if _GLIBCXX17_CONSTEXPR (__is_trivial(_Tp))
+      if _GLIBCXX_CONSTEXPR (__is_trivial(_Tp))
 	{
 	  if (__b)
 	    __builtin_memcpy(__o, __b, (__e - __b) * sizeof(_Tp));
@@ -110,7 +113,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     __valarray_copy_construct (const _Tp* __restrict__ __a, size_t __n,
 			       size_t __s, _Tp* __restrict__ __o)
     {
-      if _GLIBCXX17_CONSTEXPR (__is_trivial(_Tp))
+      if _GLIBCXX_CONSTEXPR (__is_trivial(_Tp))
 	while (__n--)
 	  {
 	    *__o++ = *__a;
@@ -131,7 +134,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 			       const size_t* __restrict__ __i,
 			       _Tp* __restrict__ __o, size_t __n)
     {
-      if (__is_trivial(_Tp))
+      if _GLIBCXX_CONSTEXPR (__is_trivial(_Tp))
 	while (__n--)
 	  *__o++ = __a[*__i++];
       else
@@ -144,7 +147,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline void
     __valarray_destroy_elements(_Tp* __b, _Tp* __e)
     {
-      if (!__is_trivial(_Tp))
+      if _GLIBCXX_CONSTEXPR (!__is_trivial(_Tp))
 	while (__b != __e)
 	  {
 	    __b->~_Tp();
@@ -152,6 +155,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  }
     }
 
+#pragma GCC diagnostic pop
+
   // Fill a plain array __a[<__n>] with __t
   template<typename _Tp>
     inline void
diff --git a/libstdc++-v3/include/experimental/numeric b/libstdc++-v3/include/experimental/numeric
index 381ecf3367c..33e9731f2ce 100644
--- a/libstdc++-v3/include/experimental/numeric
+++ b/libstdc++-v3/include/experimental/numeric
@@ -88,9 +88,12 @@ inline namespace fundamentals_v2
 	return 0;
       _Ct __r = __m2 / __detail::__gcd<make_unsigned_t<_Ct>>(__m2, __n2);
 
-      if _GLIBCXX17_CONSTEXPR (is_signed_v<_Ct>)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+      if constexpr (is_signed_v<_Ct>)
 	if (__is_constant_evaluated())
 	  return __r * __n2; // constant evaluation can detect overflow here.
+#pragma GCC diagnostic pop
 
       bool __overflow = __builtin_mul_overflow(__r, __n2, &__r);
       __glibcxx_assert(!__overflow);
diff --git a/libstdc++-v3/include/std/bit b/libstdc++-v3/include/std/bit
index a4817818d19..5187c96182f 100644
--- a/libstdc++-v3/include/std/bit
+++ b/libstdc++-v3/include/std/bit
@@ -153,13 +153,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif // __cpp_lib_byteswap
 
   /// @cond undocumented
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
 
   template<typename _Tp>
     constexpr _Tp
     __rotl(_Tp __x, int __s) noexcept
     {
       constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
-      if _GLIBCXX17_CONSTEXPR ((_Nd & (_Nd - 1)) == 0)
+      if constexpr ((_Nd & (_Nd - 1)) == 0)
 	{
 	  // Variant for power of two _Nd which the compiler can
 	  // easily pattern match.
@@ -181,7 +183,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     __rotr(_Tp __x, int __s) noexcept
     {
       constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits;
-      if _GLIBCXX17_CONSTEXPR ((_Nd & (_Nd - 1)) == 0)
+      if constexpr ((_Nd & (_Nd - 1)) == 0)
 	{
 	  // Variant for power of two _Nd which the compiler can
 	  // easily pattern match.
@@ -215,17 +217,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
       constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
 
-      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
+      if constexpr (_Nd <= _Nd_u)
 	{
 	  constexpr int __diff = _Nd_u - _Nd;
 	  return __builtin_clz(__x) - __diff;
 	}
-      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
+      else if constexpr (_Nd <= _Nd_ul)
 	{
 	  constexpr int __diff = _Nd_ul - _Nd;
 	  return __builtin_clzl(__x) - __diff;
 	}
-      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
+      else if constexpr (_Nd <= _Nd_ull)
 	{
 	  constexpr int __diff = _Nd_ull - _Nd;
 	  return __builtin_clzll(__x) - __diff;
@@ -272,11 +274,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
       constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
 
-      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
+      if constexpr (_Nd <= _Nd_u)
 	return __builtin_ctz(__x);
-      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
+      else if constexpr (_Nd <= _Nd_ul)
 	return __builtin_ctzl(__x);
-      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
+      else if constexpr (_Nd <= _Nd_ull)
 	return __builtin_ctzll(__x);
       else // (_Nd > _Nd_ull)
 	{
@@ -314,11 +316,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits;
       constexpr auto _Nd_u = __int_traits<unsigned>::__digits;
 
-      if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u)
+      if constexpr (_Nd <= _Nd_u)
 	return __builtin_popcount(__x);
-      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul)
+      else if constexpr (_Nd <= _Nd_ul)
 	return __builtin_popcountl(__x);
-      else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull)
+      else if constexpr (_Nd <= _Nd_ull)
 	return __builtin_popcountll(__x);
       else // (_Nd > _Nd_ull)
 	{
@@ -357,7 +359,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
 
       using __promoted_type = decltype(__x << 1);
-      if _GLIBCXX17_CONSTEXPR (!is_same<__promoted_type, _Tp>::value)
+      if constexpr (!is_same<__promoted_type, _Tp>::value)
 	{
 	  // If __x undergoes integral promotion then shifting by _Nd is
 	  // not undefined. In order to make the shift undefined, so that
@@ -388,6 +390,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return _Nd - std::__countl_zero(__x);
     }
 
+#pragma GCC diagnostic pop
   /// @endcond
 
 #ifdef __cpp_lib_bitops // C++ >= 20
diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset
index c07117ae8d8..8b5d270c2a9 100644
--- a/libstdc++-v3/include/std/bitset
+++ b/libstdc++-v3/include/std/bitset
@@ -1605,6 +1605,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
       typedef typename __istream_type::ios_base    __ios_base;
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
       struct _Buffer
       {
 	static _GLIBCXX_CONSTEXPR bool _S_use_alloca() { return _Nb <= 256; }
@@ -1613,18 +1615,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
 	~_Buffer()
 	{
-	  if _GLIBCXX17_CONSTEXPR (!_S_use_alloca())
+	  if _GLIBCXX_CONSTEXPR (!_S_use_alloca())
 	    delete[] _M_ptr;
 	}
 
 	_CharT* const _M_ptr;
       };
       _CharT* __ptr;
-      if _GLIBCXX17_CONSTEXPR (_Buffer::_S_use_alloca())
+      if _GLIBCXX_CONSTEXPR (_Buffer::_S_use_alloca())
 	__ptr = (_CharT*)__builtin_alloca(_Nb);
       else
 	__ptr = new _CharT[_Nb];
       const _Buffer __buf(__ptr);
+#pragma GCC diagnostic pop
 
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 303. Bitset input operator underspecified
@@ -1673,7 +1676,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	    { __is._M_setstate(__ios_base::badbit); }
 	}
 
-      if _GLIBCXX17_CONSTEXPR (_Nb)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+      if _GLIBCXX_CONSTEXPR (_Nb)
       {
 	if (size_t __len = __ptr - __buf._M_ptr)
 	  __x.template _M_copy_from_ptr<_CharT, _Traits>(__buf._M_ptr, __len,
@@ -1682,6 +1687,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	else
 	  __state |= __ios_base::failbit;
       }
+#pragma GCC diagnostic pop
       if (__state)
 	__is.setstate(__state);
       return __is;
diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv
index 75fcb7157c5..dda49ce72d0 100644
--- a/libstdc++-v3/include/std/charconv
+++ b/libstdc++-v3/include/std/charconv
@@ -35,6 +35,7 @@
 
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wpedantic" // __int128
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
 
 #include <bits/requires_hosted.h> // for error codes
 
@@ -239,7 +240,7 @@ namespace __detail
       to_chars_result __res;
       unsigned __len = 0;
 
-      if _GLIBCXX17_CONSTEXPR (__gnu_cxx::__int_traits<_Tp>::__digits <= 16)
+      if constexpr (__gnu_cxx::__int_traits<_Tp>::__digits <= 16)
 	{
 	  __len = __val > 077777u ? 6u
 	    : __val > 07777u ? 5u
@@ -336,7 +337,7 @@ namespace __detail
 	  *__first = '0';
 	  return { __first + 1, errc{} };
 	}
-      else if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
+      else if constexpr (std::is_signed<_Tp>::value)
 	if (__value < 0)
 	  {
 	    *__first++ = '-';
@@ -452,7 +453,7 @@ namespace __detail
     _GLIBCXX20_CONSTEXPR unsigned char
     __from_chars_alnum_to_val(unsigned char __c)
     {
-      if _GLIBCXX17_CONSTEXPR (_DecOnly)
+      if constexpr (_DecOnly)
 	return static_cast<unsigned char>(__c - '0');
       else
 	return __from_chars_alnum_to_val_table<_DecOnly>::value.__data[__c];
@@ -562,7 +563,7 @@ namespace __detail
       from_chars_result __res{__first, {}};
 
       int __sign = 1;
-      if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
+      if constexpr (std::is_signed<_Tp>::value)
 	if (__first != __last && *__first == '-')
 	  {
 	    __sign = -1;
@@ -595,7 +596,7 @@ namespace __detail
 	    __res.ec = errc::result_out_of_range;
 	  else
 	    {
-	      if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
+	      if constexpr (std::is_signed<_Tp>::value)
 		{
 		  _Tp __tmp;
 		  if (__builtin_mul_overflow(__val, __sign, &__tmp))
@@ -605,8 +606,8 @@ namespace __detail
 		}
 	      else
 		{
-		  if _GLIBCXX17_CONSTEXPR (__gnu_cxx::__int_traits<_Up>::__max
-		      > __gnu_cxx::__int_traits<_Tp>::__max)
+		  if constexpr (__gnu_cxx::__int_traits<_Up>::__max
+				 > __gnu_cxx::__int_traits<_Tp>::__max)
 		    {
 		      if (__val > __gnu_cxx::__int_traits<_Tp>::__max)
 			__res.ec = errc::result_out_of_range;
diff --git a/libstdc++-v3/include/tr2/dynamic_bitset b/libstdc++-v3/include/tr2/dynamic_bitset
index 2446f355d55..b308e7283c2 100644
--- a/libstdc++-v3/include/tr2/dynamic_bitset
+++ b/libstdc++-v3/include/tr2/dynamic_bitset
@@ -99,7 +99,9 @@ namespace tr2
 	if (__val == 0)
 	  return;
 
-	if _GLIBCXX17_CONSTEXPR (sizeof(__val) == sizeof(block_type))
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+	if constexpr (sizeof(__val) == sizeof(block_type))
 	  _M_w[0] = __val;
 	else
 	  {
@@ -111,6 +113,7 @@ namespace tr2
 		__val >>= _S_bits_per_block;
 	      }
 	  }
+#pragma GCC diagnostic pop
       }
 
       void
@@ -667,13 +670,16 @@ namespace tr2
       operator=(dynamic_bitset&& __b)
       noexcept(std::is_nothrow_move_assignable<_Base>::value)
       {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
 	static_cast<_Base&>(*this) = static_cast<_Base&&>(__b);
 	_M_Nb = __b._M_Nb;
-	if _GLIBCXX17_CONSTEXPR (std::is_nothrow_move_assignable<_Base>::value)
+	if constexpr (std::is_nothrow_move_assignable<_Base>::value)
 	  __b._M_Nb = 0;
 	else if (get_allocator() == __b.get_allocator())
 	  __b._M_Nb = 0;
 	return *this;
+#pragma GCC diagnostic pop
       }
 
       /**
diff --git a/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc b/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc
index 3c5aa7feefc..0afba654152 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc
+++ b/libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc
@@ -12,4 +12,4 @@ auto x = std::generate_canonical<std::size_t,
 
 // { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 270 }
 
-// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3351 }
+// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3357 }
-- 
2.49.0



More information about the Libstdc++ mailing list