From 18048e65b0aedc1e0e0a60310ab6a93753f3cbf7 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 30 Sep 2005 16:54:54 +0000 Subject: [PATCH] re PR libstdc++/24064 (tr1::unordered_map seems to seg-fault when caching hash values) 2005-09-30 Paolo Carlini PR libstdc++/24064 * include/tr1/hashtable (hash_code_base<>::store_code): Add. (hashtable<>::insert(const value_type&)): Use it. * testsuite/tr1/6_containers/unordered/hashtable/24064.cc: New. From-SVN: r104823 --- libstdc++-v3/ChangeLog | 7 +++ libstdc++-v3/include/tr1/hashtable | 14 ++++++ .../6_containers/unordered/hashtable/24064.cc | 46 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 libstdc++-v3/testsuite/tr1/6_containers/unordered/hashtable/24064.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 87782611e6e..b9db59ea588 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2005-09-30 Paolo Carlini + + PR libstdc++/24064 + * include/tr1/hashtable (hash_code_base<>::store_code): Add. + (hashtable<>::insert(const value_type&)): Use it. + * testsuite/tr1/6_containers/unordered/hashtable/24064.cc: New. + 2005-09-30 Paolo Carlini PR libstdc++/23953 diff --git a/libstdc++-v3/include/tr1/hashtable b/libstdc++-v3/include/tr1/hashtable index 790e7e30427..619709433d0 100644 --- a/libstdc++-v3/include/tr1/hashtable +++ b/libstdc++-v3/include/tr1/hashtable @@ -626,6 +626,10 @@ namespace Internal compare(const Key& k, hash_code_t, hash_node* n) const { return m_eq (k, m_extract(n->m_v)); } + void + store_code(hash_node*, hash_code_t) const + { } + void copy_code(hash_node*, const hash_node*) const { } @@ -698,6 +702,10 @@ namespace Internal compare(const Key& k, hash_code_t, hash_node* n) const { return m_eq (k, m_extract(n->m_v)); } + void + store_code(hash_node*, hash_code_t) const + { } + void copy_code(hash_node*, const hash_node*) const { } @@ -756,6 +764,10 @@ namespace Internal compare(const Key& k, hash_code_t c, hash_node* n) const { return c == n->hash_code && m_eq(k, m_extract(n->m_v)); } + void + store_code(hash_node* n, hash_code_t c) const + { n->hash_code = c; } + void copy_code(hash_node* to, const hash_node* from) const @@ -1508,6 +1520,7 @@ namespace tr1 } new_node->m_next = m_buckets[n]; + this->store_code(new_node, code); m_buckets[n] = new_node; ++m_element_count; return std::make_pair(iterator(new_node, m_buckets + n), true); @@ -1549,6 +1562,7 @@ namespace tr1 new_node->m_next = m_buckets[n]; m_buckets[n] = new_node; } + this->store_code(new_node, code); ++m_element_count; return iterator(new_node, m_buckets + n); diff --git a/libstdc++-v3/testsuite/tr1/6_containers/unordered/hashtable/24064.cc b/libstdc++-v3/testsuite/tr1/6_containers/unordered/hashtable/24064.cc new file mode 100644 index 00000000000..74eabbf53f9 --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/6_containers/unordered/hashtable/24064.cc @@ -0,0 +1,46 @@ +// Copyright (C) 2005 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 6.3 Unordered associative containers + +#include +#include + +// libstdc++/24064 +void test01() +{ + bool test __attribute__((unused)) = true; + + using namespace std; + using namespace tr1; + + unordered_map, equal_to, + allocator >, true> m; + + for (int i = 0; i < 1000; ++i) + m[i] = '0' + i % 9; + + for (int i = 0; i < 1000; ++i) + VERIFY( ++m.find(i)->second == '1' + i % 9 ); +} + +int main() +{ + test01(); + return 0; +}