aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2013-02-11 00:19:29 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2013-02-11 00:19:29 +0000
commitdfed5434f3946d39cef0d6965891a927f8b388d2 (patch)
treeb7fd036f3b00bc53b17087e13cf71796eaa81709
parenta9b68b8289efff8361e9f3a66c9055a70ce62ee5 (diff)
downloadgcc-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
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/include/bits/hashtable.h11
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_set/56267.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_set/not_default_constructible_hash_neg.cc2
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>