aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kruegler <daniel.kruegler@gmail.com>2017-03-23 19:40:16 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2017-03-23 19:40:16 +0000
commit7f359d19d0b1b13c21e7a325ef391ed19bc8ba70 (patch)
treea71417b0083d1c3401026601882728aa88056731
parent288695f7a49e187d9c4e0dad6024aed227512477 (diff)
downloadgcc-7f359d19d0b1b13c21e7a325ef391ed19bc8ba70.zip
gcc-7f359d19d0b1b13c21e7a325ef391ed19bc8ba70.tar.gz
gcc-7f359d19d0b1b13c21e7a325ef391ed19bc8ba70.tar.bz2
Implement LWG 2686, std::hash<error_condition>, for C++17
2017-03-23 Daniel Kruegler <daniel.kruegler@gmail.com> Implement LWG 2686, Why is std::hash specialized for error_code, but not error_condition? * include/std/system_error (hash<error_condition>): Define for C++17. * testsuite/20_util/hash/operators/size_t.cc (hash<error_condition>): Instantiate test for error_condition. * testsuite/20_util/hash/requirements/explicit_instantiation.cc (hash<error_condition>): Instantiate hash<error_condition>. From-SVN: r246424
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/std/system_error22
-rw-r--r--libstdc++-v3/testsuite/20_util/hash/operators/size_t.cc3
-rw-r--r--libstdc++-v3/testsuite/20_util/hash/requirements/explicit_instantiation.cc3
4 files changed, 32 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index b3e3fe2..1425d28 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,13 @@
2017-03-23 Daniel Kruegler <daniel.kruegler@gmail.com>
+ Implement LWG 2686, Why is std::hash specialized for error_code,
+ but not error_condition?
+ * include/std/system_error (hash<error_condition>): Define for C++17.
+ * testsuite/20_util/hash/operators/size_t.cc (hash<error_condition>):
+ Instantiate test for error_condition.
+ * testsuite/20_util/hash/requirements/explicit_instantiation.cc
+ (hash<error_condition>): Instantiate hash<error_condition>.
+
* include/bits/c++config (_GLIBCXX17_INLINE): Define.
* include/bits/regex_constants.h (All std::regex_constants constants):
Add _GLIBCXX17_INLINE as per P0607R0.
diff --git a/libstdc++-v3/include/std/system_error b/libstdc++-v3/include/std/system_error
index 6775a6e..ec7d25f 100644
--- a/libstdc++-v3/include/std/system_error
+++ b/libstdc++-v3/include/std/system_error
@@ -373,14 +373,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
-#ifndef _GLIBCXX_COMPATIBILITY_CXX0X
-
#include <bits/functional_hash.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
+#ifndef _GLIBCXX_COMPATIBILITY_CXX0X
// DR 1182.
/// std::hash specialization for error_code.
template<>
@@ -394,12 +393,27 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return std::_Hash_impl::__hash_combine(__e._M_cat, __tmp);
}
};
+#endif // _GLIBCXX_COMPATIBILITY_CXX0X
+
+#if __cplusplus > 201402L
+ // DR 2686.
+ /// std::hash specialization for error_condition.
+ template<>
+ struct hash<error_condition>
+ : public __hash_base<size_t, error_condition>
+ {
+ size_t
+ operator()(const error_condition& __e) const noexcept
+ {
+ const size_t __tmp = std::_Hash_impl::hash(__e.value());
+ return std::_Hash_impl::__hash_combine(__e.category(), __tmp);
+ }
+ };
+#endif
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
-#endif // _GLIBCXX_COMPATIBILITY_CXX0X
-
#endif // C++11
#endif // _GLIBCXX_SYSTEM_ERROR
diff --git a/libstdc++-v3/testsuite/20_util/hash/operators/size_t.cc b/libstdc++-v3/testsuite/20_util/hash/operators/size_t.cc
index ad02843..cc191d6 100644
--- a/libstdc++-v3/testsuite/20_util/hash/operators/size_t.cc
+++ b/libstdc++-v3/testsuite/20_util/hash/operators/size_t.cc
@@ -43,6 +43,9 @@ template<typename T>
void test01()
{
do_test<std::error_code>();
+#if __cplusplus > 201402L
+ do_test<std::error_condition>();
+#endif
}
int main()
diff --git a/libstdc++-v3/testsuite/20_util/hash/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/hash/requirements/explicit_instantiation.cc
index e9e5ea1..d01829a 100644
--- a/libstdc++-v3/testsuite/20_util/hash/requirements/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/20_util/hash/requirements/explicit_instantiation.cc
@@ -40,6 +40,9 @@ template class std::hash<long double>;
template class std::hash<void*>;
template class std::hash<std::string>;
template class std::hash<std::error_code>;
+#if __cplusplus > 201402L
+template class std::hash<std::error_condition>;
+#endif
#ifdef _GLIBCXX_USE_WCHAR_T
template class std::hash<wchar_t>;