https://gcc.gnu.org/g:ea05497d4a329f183ffb5428befc957c5522ef86
commit r16-4329-gea05497d4a329f183ffb5428befc957c5522ef86 Author: Jonathan Wakely <[email protected]> Date: Wed Oct 8 15:26:54 2025 +0100 libstdc++: Extend constexpr if to C++14 in _Hashtable::_S_nothrow_move() We can use diagnostic pragmas to allow the constexpr if version of this function to be used for C++14 as well. We still need the __and_ version for C++11 because we can't use 'if' in constexpr functions at all before C++14. Also use the integral_constant::value static data member instead of invoking integral_constant::operator(), as it's a tiny bit cheaper to compiler. libstdc++-v3/ChangeLog: * include/bits/hashtable.h (_Hashtable::_S_nothrow_move): Use diagnostic pragmas to allow constexpr if in C++14. Use value member instead of operator(). Reviewed-by: Tomasz KamiĆski <[email protected]> Diff: --- libstdc++-v3/include/bits/hashtable.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index 20f9bd98d5b7..b5a71f516f88 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -477,15 +477,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static constexpr bool _S_nothrow_move() { -#if __cplusplus <= 201402L +#if __cpp_constexpr >= 201304 // >= C++14 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr + if constexpr (_No_realloc) + if constexpr (is_nothrow_copy_constructible<_Hash>::value) + return is_nothrow_copy_constructible<_Equal>::value; + return false; +# pragma GCC diagnostic pop +#else // In C++11 a constexpr function must be a single statement. return __and_<__bool_constant<_No_realloc>, is_nothrow_copy_constructible<_Hash>, is_nothrow_copy_constructible<_Equal>>::value; -#else - if constexpr (_No_realloc) - if constexpr (is_nothrow_copy_constructible<_Hash>()) - return is_nothrow_copy_constructible<_Equal>(); - return false; #endif }
