diff options
author | Jonathan Wakely <jwakely.gcc@gmail.com> | 2013-02-11 00:19:29 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2013-02-11 00:19:29 +0000 |
commit | dfed5434f3946d39cef0d6965891a927f8b388d2 (patch) | |
tree | b7fd036f3b00bc53b17087e13cf71796eaa81709 | |
parent | a9b68b8289efff8361e9f3a66c9055a70ce62ee5 (diff) | |
download | gcc-dfed5434f3946d39cef0d6965891a927f8b388d2.zip gcc-dfed5434f3946d39cef0d6965891a927f8b388d2.tar.gz gcc-dfed5434f3946d39cef0d6965891a927f8b388d2.tar.bz2 |
re PR libstdc++/56267 (unordered containers require Assignable hash function)
PR libstdc++/56267
* include/bits/hashtable.h (__cache_default): Check if hash function
is copy assignable.
* testsuite/23_containers/unordered_set/56267.cc: New.
* testsuite/23_containers/unordered_set/instantiation_neg.cc: Adjust
dg-error line number.
* testsuite/23_containers/unordered_set/
not_default_constructible_hash_neg.cc: Likewise.
From-SVN: r195936
5 files changed, 56 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 775ad99..522c885 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,14 @@ 2013-02-10 Jonathan Wakely <jwakely.gcc@gmail.com> + PR libstdc++/56267 + * include/bits/hashtable.h (__cache_default): Check if hash function + is copy assignable. + * testsuite/23_containers/unordered_set/56267.cc: New. + * testsuite/23_containers/unordered_set/instantiation_neg.cc: Adjust + dg-error line number. + * testsuite/23_containers/unordered_set/ + not_default_constructible_hash_neg.cc: Likewise. + PR libstdc++/56278 * include/bits/hashtable_policy.h (_Hash_code_base): Make default constructor public. diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index 6515b71..b82cda3 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -43,8 +43,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = __not_<__and_<// Do not cache for fast hasher. __is_fast_hash<_Hash>, // Mandatory to make local_iterator default - // constructible. + // constructible and assignable. is_default_constructible<_Hash>, + is_copy_assignable<_Hash>, // Mandatory to have erase not throwing. __detail::__is_noexcept_hash<_Tp, _Hash>>>; @@ -269,6 +270,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION "Cache the hash code or make functors involved in hash code" " and bucket index computation default constructible"); + // When hash codes are not cached local iterator inherits from + // __hash_code_base above to compute node bucket index so it has to be + // assignable. + static_assert(__if_hash_not_cached< + is_copy_assignable<__hash_code_base>>::value, + "Cache the hash code or make functors involved in hash code" + " and bucket index computation copy assignable"); + public: template<typename _Keya, typename _Valuea, typename _Alloca, typename _ExtractKeya, typename _Equala, diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/56267.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/56267.cc new file mode 100644 index 0000000..0e9c71a --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/56267.cc @@ -0,0 +1,35 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2013 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// libstdc++/56267 + +#include <unordered_set> + +struct hash : std::hash<int> +{ + hash& operator=(const hash&) = delete; +}; + +int main() +{ + std::unordered_set<int, hash> s{ 0, 1, 2 }; + auto i = s.begin(0); + i = i; +} diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc index 827691f..6712d62 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc @@ -19,7 +19,7 @@ // with this library; see the file COPYING3. If not see // <http://www.gnu.org/licenses/>. -// { dg-error "with noexcept" "" { target *-*-* } 251 } +// { dg-error "with noexcept" "" { target *-*-* } 252 } #include <unordered_set> diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/not_default_constructible_hash_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/not_default_constructible_hash_neg.cc index bd62a08..53a25bc 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/not_default_constructible_hash_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/not_default_constructible_hash_neg.cc @@ -19,7 +19,7 @@ // with this library; see the file COPYING3. If not see // <http://www.gnu.org/licenses/>. -// { dg-error "default constructible" "" { target *-*-* } 267 } +// { dg-error "default constructible" "" { target *-*-* } 268 } #include <unordered_set> |