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 <tkaminsk@redhat.com>
This commit is contained in:
Jonathan Wakely
2025-10-08 15:26:54 +01:00
committed by Jonathan Wakely
parent 71e95e871d
commit ea05497d4a

View File

@@ -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
}