On Wed, Oct 8, 2025 at 6:55 PM Jonathan Wakely <[email protected]> wrote:

> 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().
> ---
>
> Tested x86_64-linux.
>
LGTM.

>
>  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 da6a1e19a636..06cc51ac4a0f 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
>         }
>
> --
> 2.51.0
>
>

Reply via email to