diff options
author | Daniel Kruegler <daniel.kruegler@gmail.com> | 2017-03-23 19:40:16 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2017-03-23 19:40:16 +0000 |
commit | 7f359d19d0b1b13c21e7a325ef391ed19bc8ba70 (patch) | |
tree | a71417b0083d1c3401026601882728aa88056731 | |
parent | 288695f7a49e187d9c4e0dad6024aed227512477 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/std/system_error | 22 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/hash/operators/size_t.cc | 3 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/hash/requirements/explicit_instantiation.cc | 3 |
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>; |