On Tue, Apr 29, 2025 at 11:05 AM Jonathan Wakely <jwak...@redhat.com> wrote:
> 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. > LGTM > > 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 > >