diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2010-02-11 18:11:01 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2010-02-11 18:11:01 +0000 |
commit | 932b650839a319e0f4236d74252cad0bd0b017b2 (patch) | |
tree | 9d2d8fe8b7b6404b007b8252226cfac5e01caf63 | |
parent | 6d8921479a2a47ec10342142483b9291211c95c9 (diff) | |
download | gcc-932b650839a319e0f4236d74252cad0bd0b017b2.zip gcc-932b650839a319e0f4236d74252cad0bd0b017b2.tar.gz gcc-932b650839a319e0f4236d74252cad0bd0b017b2.tar.bz2 |
PR libstdc++/41975, DR 579
2010-02-11 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/41975, DR 579
* include/bits/hashtable.h (_Hashtable<>::_M_erase_node): Remove.
(erase(const_iterator), erase(const_iterator, const_iterator)):
Change return type to void.
* include/debug/unordered_map: Adjust.
* include/debug/unordered_set: Likewise.
* testsuite/util/exception/safety.h: Likewise.
* testsuite/23_containers/unordered_map/erase/1.cc: Likewise.
* testsuite/23_containers/unordered_map/erase/24061-map.cc: Likewise.
* testsuite/23_containers/unordered_set/erase/1.cc: Likewise.
* testsuite/23_containers/unordered_set/erase/24061-map.cc: Likewise.
* testsuite/23_containers/unordered_multimap/erase/1.cc: Likewise.
* testsuite/23_containers/unordered_multimap/erase/24061-map.cc:
Likewise.
* testsuite/23_containers/unordered_multiset/erase/1.cc: Likewise.
* testsuite/23_containers/unordered_multiset/erase/24061-map.cc:
Likewise.
From-SVN: r156705
13 files changed, 117 insertions, 161 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1f2d5e1..a571531 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,25 @@ 2010-02-11 Paolo Carlini <paolo.carlini@oracle.com> + PR libstdc++/41975, DR 579 + * include/bits/hashtable.h (_Hashtable<>::_M_erase_node): Remove. + (erase(const_iterator), erase(const_iterator, const_iterator)): + Change return type to void. + * include/debug/unordered_map: Adjust. + * include/debug/unordered_set: Likewise. + * testsuite/util/exception/safety.h: Likewise. + * testsuite/23_containers/unordered_map/erase/1.cc: Likewise. + * testsuite/23_containers/unordered_map/erase/24061-map.cc: Likewise. + * testsuite/23_containers/unordered_set/erase/1.cc: Likewise. + * testsuite/23_containers/unordered_set/erase/24061-map.cc: Likewise. + * testsuite/23_containers/unordered_multimap/erase/1.cc: Likewise. + * testsuite/23_containers/unordered_multimap/erase/24061-map.cc: + Likewise. + * testsuite/23_containers/unordered_multiset/erase/1.cc: Likewise. + * testsuite/23_containers/unordered_multiset/erase/24061-map.cc: + Likewise. + +2010-02-11 Paolo Carlini <paolo.carlini@oracle.com> + * config/abi/pre/gnu.ver: Avoid exporting inadvertently std::nested_exception symbols at GLIBCXX_3.4. diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index 96bb8ac..6d46932 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -385,9 +385,6 @@ namespace std iterator _M_insert(const value_type&, std::false_type); - void - _M_erase_node(_Node*, _Node**); - public: // Insert and erase _Insert_Return_Type @@ -407,13 +404,13 @@ namespace std insert(initializer_list<value_type> __l) { this->insert(__l.begin(), __l.end()); } - iterator + void erase(const_iterator); size_type erase(const key_type&); - iterator + void erase(const_iterator, const_iterator); void @@ -977,34 +974,6 @@ namespace std return iterator(__new_node, _M_buckets + __n); } - // For erase(iterator) and erase(const_iterator). - template<typename _Key, typename _Value, - typename _Allocator, typename _ExtractKey, typename _Equal, - typename _H1, typename _H2, typename _Hash, typename _RehashPolicy, - bool __chc, bool __cit, bool __uk> - void - _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, - _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>:: - _M_erase_node(_Node* __p, _Node** __b) - { - _Node* __cur = *__b; - if (__cur == __p) - *__b = __cur->_M_next; - else - { - _Node* __next = __cur->_M_next; - while (__next != __p) - { - __cur = __next; - __next = __cur->_M_next; - } - __cur->_M_next = __next->_M_next; - } - - _M_deallocate_node(__p); - --_M_element_count; - } - template<typename _Key, typename _Value, typename _Allocator, typename _ExtractKey, typename _Equal, typename _H1, typename _H2, typename _Hash, typename _RehashPolicy, @@ -1030,17 +999,30 @@ namespace std typename _Allocator, typename _ExtractKey, typename _Equal, typename _H1, typename _H2, typename _Hash, typename _RehashPolicy, bool __chc, bool __cit, bool __uk> - typename _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, - _H1, _H2, _Hash, _RehashPolicy, - __chc, __cit, __uk>::iterator + void _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>:: erase(const_iterator __it) { - iterator __result(__it._M_cur_node, __it._M_cur_bucket); - ++__result; - _M_erase_node(__it._M_cur_node, __it._M_cur_bucket); - return __result; + _Node* __p = __it._M_cur_node; + _Node** __b = __it._M_cur_bucket; + + _Node* __cur = *__b; + if (__cur == __p) + *__b = __cur->_M_next; + else + { + _Node* __next = __cur->_M_next; + while (__next != __p) + { + __cur = __next; + __next = __cur->_M_next; + } + __cur->_M_next = __next->_M_next; + } + + _M_deallocate_node(__p); + --_M_element_count; } template<typename _Key, typename _Value, @@ -1102,17 +1084,17 @@ namespace std typename _Allocator, typename _ExtractKey, typename _Equal, typename _H1, typename _H2, typename _Hash, typename _RehashPolicy, bool __chc, bool __cit, bool __uk> - typename _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, - _H1, _H2, _Hash, _RehashPolicy, - __chc, __cit, __uk>::iterator + void _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>:: erase(const_iterator __first, const_iterator __last) { - while (__first != __last) - __first = this->erase(__first); - return iterator(__last._M_cur_node, __last._M_cur_bucket); - } + if (__first == begin() && __last == end()) + clear(); + else + while (__first != __last) + erase(__first++); + } template<typename _Key, typename _Value, typename _Allocator, typename _ExtractKey, typename _Equal, diff --git a/libstdc++-v3/include/debug/unordered_map b/libstdc++-v3/include/debug/unordered_map index a5e6174..5f49aa6 100644 --- a/libstdc++-v3/include/debug/unordered_map +++ b/libstdc++-v3/include/debug/unordered_map @@ -243,25 +243,24 @@ namespace __debug return __ret; } - iterator + void erase(const_iterator __it) { __glibcxx_check_erase(__it); __it._M_invalidate(); - return iterator(_Base::erase(__it.base()), this); + _Base::erase(__it.base()); } - iterator + void erase(const_iterator __first, const_iterator __last) { __glibcxx_check_erase_range(__first, __last); for (const_iterator __tmp = __first; __tmp != __last;) - { - const_iterator __victim = __tmp++; - __victim._M_invalidate(); - } - return iterator(_Base::erase(__first.base(), - __last.base()), this); + { + const_iterator __victim = __tmp++; + __victim._M_invalidate(); + } + _Base::erase(__first.base(), __last.base()); } _Base& @@ -480,25 +479,24 @@ namespace __debug return __ret; } - iterator + void erase(const_iterator __it) { __glibcxx_check_erase(__it); __it._M_invalidate(); - return iterator(_Base::erase(__it.base()), this); + _Base::erase(__it.base()); } - iterator + void erase(const_iterator __first, const_iterator __last) { __glibcxx_check_erase_range(__first, __last); for (const_iterator __tmp = __first; __tmp != __last;) - { - const_iterator __victim = __tmp++; - __victim._M_invalidate(); - } - return iterator(_Base::erase(__first.base(), - __last.base()), this); + { + const_iterator __victim = __tmp++; + __victim._M_invalidate(); + } + _Base::erase(__first.base(), __last.base()); } _Base& diff --git a/libstdc++-v3/include/debug/unordered_set b/libstdc++-v3/include/debug/unordered_set index f851718..8efe3fb 100644 --- a/libstdc++-v3/include/debug/unordered_set +++ b/libstdc++-v3/include/debug/unordered_set @@ -243,25 +243,24 @@ namespace __debug return __ret; } - iterator + void erase(const_iterator __it) { __glibcxx_check_erase(__it); __it._M_invalidate(); - return iterator(_Base::erase(__it.base()), this); + _Base::erase(__it.base()); } - iterator + void erase(const_iterator __first, const_iterator __last) { __glibcxx_check_erase_range(__first, __last); for (const_iterator __tmp = __first; __tmp != __last;) - { - const_iterator __victim = __tmp++; - __victim._M_invalidate(); - } - return iterator(_Base::erase(__first.base(), - __last.base()), this); + { + const_iterator __victim = __tmp++; + __victim._M_invalidate(); + } + _Base::erase(__first.base(), __last.base()); } _Base& @@ -478,25 +477,24 @@ namespace __debug return __ret; } - iterator + void erase(const_iterator __it) { __glibcxx_check_erase(__it); __it._M_invalidate(); - return iterator(_Base::erase(__it.base()), this); + _Base::erase(__it.base()); } - iterator + void erase(const_iterator __first, const_iterator __last) { __glibcxx_check_erase_range(__first, __last); for (const_iterator __tmp = __first; __tmp != __last;) - { - const_iterator __victim = __tmp++; - __victim._M_invalidate(); - } - return iterator(_Base::erase(__first.base(), - __last.base()), this); + { + const_iterator __victim = __tmp++; + __victim._M_invalidate(); + } + _Base::erase(__first.base(), __last.base()); } _Base& diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc index f9b74e0..70fb41e 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc @@ -113,7 +113,7 @@ void test01() VERIFY( m1.size() == 2 ); VERIFY( ++it10 == m1.end() ); - VERIFY( m1.erase(m1.begin()) != m1.end() ); + m1.erase(m1.begin()); VERIFY( m1.size() == 1 ); VERIFY( m1.begin() == it11 ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc index 87ab474..759602b 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc @@ -51,10 +51,8 @@ void test01() ++it1; iterator it2 = it1; ++it2; - iterator it3 = m1.erase(it1); + m1.erase(it1); VERIFY( m1.size() == 9 ); - VERIFY( it3 == it2 ); - VERIFY( *it3 == *it2 ); iterator it4 = m1.begin(); ++it4; @@ -63,10 +61,8 @@ void test01() iterator it5 = it4; ++it5; ++it5; - iterator it6 = m1.erase(it4, it5); + m1.erase(it4, it5); VERIFY( m1.size() == 7 ); - VERIFY( it6 == it5 ); - VERIFY( *it6 == *it5 ); const_iterator it7 = m1.begin(); ++it7; @@ -74,10 +70,8 @@ void test01() ++it7; const_iterator it8 = it7; ++it8; - const_iterator it9 = m1.erase(it7); + m1.erase(it7); VERIFY( m1.size() == 6 ); - VERIFY( it9 == it8 ); - VERIFY( *it9 == *it8 ); const_iterator it10 = m1.begin(); ++it10; @@ -86,16 +80,11 @@ void test01() ++it11; ++it11; ++it11; - const_iterator it12 = m1.erase(it10, it11); + m1.erase(it10, it11); VERIFY( m1.size() == 2 ); - VERIFY( it12 == it11 ); - VERIFY( *it12 == *it11 ); - VERIFY( ++it12 == m1.end() ); - iterator it13 = m1.erase(m1.begin(), m1.end()); + m1.erase(m1.begin(), m1.end()); VERIFY( m1.size() == 0 ); - VERIFY( it13 == it12 ); - VERIFY( it13 == m1.begin() ); } int main() diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc index 0aa1a07..0e60b8a 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc @@ -113,7 +113,7 @@ void test01() VERIFY( mm1.size() == 2 ); VERIFY( ++it10 == mm1.end() ); - VERIFY( mm1.erase(mm1.begin()) != mm1.end() ); + mm1.erase(mm1.begin()); VERIFY( mm1.size() == 1 ); VERIFY( mm1.begin() == it11 ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc index 545d082..0fe4eee 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc @@ -55,10 +55,8 @@ void test01() ++it1; iterator it2 = it1; ++it2; - iterator it3 = mm1.erase(it1); + mm1.erase(it1); VERIFY( mm1.size() == 12 ); - VERIFY( it3 == it2 ); - VERIFY( *it3 == *it2 ); iterator it4 = mm1.begin(); ++it4; @@ -67,10 +65,8 @@ void test01() iterator it5 = it4; ++it5; ++it5; - iterator it6 = mm1.erase(it4, it5); + mm1.erase(it4, it5); VERIFY( mm1.size() == 10 ); - VERIFY( it6 == it5 ); - VERIFY( *it6 == *it5 ); const_iterator it7 = mm1.begin(); ++it7; @@ -78,10 +74,8 @@ void test01() ++it7; const_iterator it8 = it7; ++it8; - const_iterator it9 = mm1.erase(it7); + mm1.erase(it7); VERIFY( mm1.size() == 9 ); - VERIFY( it9 == it8 ); - VERIFY( *it9 == *it8 ); const_iterator it10 = mm1.begin(); ++it10; @@ -90,15 +84,11 @@ void test01() ++it11; ++it11; ++it11; - const_iterator it12 = mm1.erase(it10, it11); + mm1.erase(it10, it11); VERIFY( mm1.size() == 5 ); - VERIFY( it12 == it11 ); - VERIFY( *it12 == *it11 ); - iterator it13 = mm1.erase(mm1.begin(), mm1.end()); + mm1.erase(mm1.begin(), mm1.end()); VERIFY( mm1.size() == 0 ); - VERIFY( it13 == mm1.end() ); - VERIFY( it13 == mm1.begin() ); } int main() diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc index 9951838..fbd8899 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc @@ -112,7 +112,7 @@ void test01() VERIFY( ms1.size() == 2 ); VERIFY( ++it10 == ms1.end() ); - VERIFY( ms1.erase(ms1.begin()) != ms1.end() ); + ms1.erase(ms1.begin()); VERIFY( ms1.size() == 1 ); VERIFY( ms1.begin() == it11 ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc index c5eea6e..568862f 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc @@ -54,10 +54,8 @@ void test01() ++it1; iterator it2 = it1; ++it2; - iterator it3 = ms1.erase(it1); + ms1.erase(it1); VERIFY( ms1.size() == 12 ); - VERIFY( it3 == it2 ); - VERIFY( *it3 == *it2 ); iterator it4 = ms1.begin(); ++it4; @@ -66,10 +64,8 @@ void test01() iterator it5 = it4; ++it5; ++it5; - iterator it6 = ms1.erase(it4, it5); + ms1.erase(it4, it5); VERIFY( ms1.size() == 10 ); - VERIFY( it6 == it5 ); - VERIFY( *it6 == *it5 ); const_iterator it7 = ms1.begin(); ++it7; @@ -77,10 +73,8 @@ void test01() ++it7; const_iterator it8 = it7; ++it8; - const_iterator it9 = ms1.erase(it7); + ms1.erase(it7); VERIFY( ms1.size() == 9 ); - VERIFY( it9 == it8 ); - VERIFY( *it9 == *it8 ); const_iterator it10 = ms1.begin(); ++it10; @@ -89,15 +83,11 @@ void test01() ++it11; ++it11; ++it11; - const_iterator it12 = ms1.erase(it10, it11); + ms1.erase(it10, it11); VERIFY( ms1.size() == 5 ); - VERIFY( it12 == it11 ); - VERIFY( *it12 == *it11 ); - iterator it13 = ms1.erase(ms1.begin(), ms1.end()); + ms1.erase(ms1.begin(), ms1.end()); VERIFY( ms1.size() == 0 ); - VERIFY( it13 == ms1.end() ); - VERIFY( it13 == ms1.begin() ); } int main() diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc index 8f59773..9bfa771 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc @@ -112,7 +112,7 @@ void test01() VERIFY( s1.size() == 2 ); VERIFY( ++it10 == s1.end() ); - VERIFY( s1.erase(s1.begin()) != s1.end() ); + s1.erase(s1.begin()); VERIFY( s1.size() == 1 ); VERIFY( s1.begin() == it11 ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc index b4cdde6..6d89208 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc @@ -50,10 +50,8 @@ void test01() ++it1; iterator it2 = it1; ++it2; - iterator it3 = s1.erase(it1); + s1.erase(it1); VERIFY( s1.size() == 9 ); - VERIFY( it3 == it2 ); - VERIFY( *it3 == *it2 ); iterator it4 = s1.begin(); ++it4; @@ -62,10 +60,8 @@ void test01() iterator it5 = it4; ++it5; ++it5; - iterator it6 = s1.erase(it4, it5); + s1.erase(it4, it5); VERIFY( s1.size() == 7 ); - VERIFY( it6 == it5 ); - VERIFY( *it6 == *it5 ); const_iterator it7 = s1.begin(); ++it7; @@ -73,10 +69,8 @@ void test01() ++it7; const_iterator it8 = it7; ++it8; - const_iterator it9 = s1.erase(it7); + s1.erase(it7); VERIFY( s1.size() == 6 ); - VERIFY( it9 == it8 ); - VERIFY( *it9 == *it8 ); const_iterator it10 = s1.begin(); ++it10; @@ -85,16 +79,11 @@ void test01() ++it11; ++it11; ++it11; - const_iterator it12 = s1.erase(it10, it11); + s1.erase(it10, it11); VERIFY( s1.size() == 2 ); - VERIFY( it12 == it11 ); - VERIFY( *it12 == *it11 ); - VERIFY( ++it12 == s1.end() ); - iterator it13 = s1.erase(s1.begin(), s1.end()); + s1.erase(s1.begin(), s1.end()); VERIFY( s1.size() == 0 ); - VERIFY( it13 == s1.end() ); - VERIFY( it13 == s1.begin() ); } int main() diff --git a/libstdc++-v3/testsuite/util/exception/safety.h b/libstdc++-v3/testsuite/util/exception/safety.h index 23862bc..2bd1ed9 100644 --- a/libstdc++-v3/testsuite/util/exception/safety.h +++ b/libstdc++-v3/testsuite/util/exception/safety.h @@ -285,9 +285,9 @@ namespace __gnu_test typedef typename container_type::iterator iterator; typedef typename container_type::const_iterator const_iterator; - iterator (container_type::* _F_erase_point)(const_iterator); - iterator (container_type::* _F_erase_range)(const_iterator, - const_iterator); + void (container_type::* _F_erase_point)(const_iterator); + void (container_type::* _F_erase_range)(const_iterator, + const_iterator); erase_base() : _F_erase_point(&container_type::erase), @@ -304,9 +304,9 @@ namespace __gnu_test typedef typename container_type::iterator iterator; typedef typename container_type::const_iterator const_iterator; - iterator (container_type::* _F_erase_point)(const_iterator); - iterator (container_type::* _F_erase_range)(const_iterator, - const_iterator); + void (container_type::* _F_erase_point)(const_iterator); + void (container_type::* _F_erase_range)(const_iterator, + const_iterator); erase_base() : _F_erase_point(&container_type::erase), @@ -321,9 +321,9 @@ namespace __gnu_test typedef typename container_type::iterator iterator; typedef typename container_type::const_iterator const_iterator; - iterator (container_type::* _F_erase_point)(const_iterator); - iterator (container_type::* _F_erase_range)(const_iterator, - const_iterator); + void (container_type::* _F_erase_point)(const_iterator); + void (container_type::* _F_erase_range)(const_iterator, + const_iterator); erase_base() : _F_erase_point(&container_type::erase), @@ -338,9 +338,9 @@ namespace __gnu_test typedef typename container_type::iterator iterator; typedef typename container_type::const_iterator const_iterator; - iterator (container_type::* _F_erase_point)(const_iterator); - iterator (container_type::* _F_erase_range)(const_iterator, - const_iterator); + void (container_type::* _F_erase_point)(const_iterator); + void (container_type::* _F_erase_range)(const_iterator, + const_iterator); erase_base() : _F_erase_point(&container_type::erase), |