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.
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