diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2013-05-10 15:18:33 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-05-10 15:18:33 +0000 |
commit | 94938aec1ab1996c4554fd3703708052144a784b (patch) | |
tree | 733216f9d05ef2101674b95a354adc2ed369f93c /libstdc++-v3/include | |
parent | 341427fa2da0894f3f9d6966aa802ad237bffe3a (diff) | |
download | gcc-94938aec1ab1996c4554fd3703708052144a784b.zip gcc-94938aec1ab1996c4554fd3703708052144a784b.tar.gz gcc-94938aec1ab1996c4554fd3703708052144a784b.tar.bz2 |
re PR libstdc++/54577 (deque<T>::erase() still takes iterator instead of const_iterator)
2013-05-10 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/54577
* include/bits/stl_deque.h (erase): Fix signatures in C++11 mode.
(_Deque_iterator<>::_M_const_cast): Add.
(deque<>::_M_erase): Declare.
* include/bits/deque.tcc: ... and define.
* include/bits/stl_list.h (erase): Fix signatures in C++11 mode.
(_List_const_iterator<>::_M_const_cast): Add.
* include/bits/list.tcc (erase (iterator)): Fix.
* include/bits/stl_iterator.h (__normal_iterator<>::_M_const_cast):
Add; include <ext/cast.h>.
* include/bits/stl_vector.h (erase): Fix signatures in C++11 mode.
(vector<>::_M_erase): Declare.
* include/bits/stl_bvector.h: Likewise.
* include/bits/vector.tcc (vector<>::_M_erase): Define.
* include/ext/vstring.h (erase): Fix signatures in C++11 mode.
* include/debug/deque: Adjust.
* include/debug/list: Likewise.
* include/debug/vector: Likewise.
* include/profile/deque: Likewise.
* include/profile/list: Likewise.
* include/profile/vector: Likewise.
* testsuite/util/exception/safety.h (erase_base<deque>,
erase_base<deque>, erase_base<vector>): Remove.
(erase_base<__versa_string>): Update.
* testsuite/ext/vstring/modifiers/char/54577.cc: New.
* testsuite/ext/vstring/modifiers/wchar_t/54577.cc: Likewise.
* testsuite/23_containers/deque/modifiers/erase/54577.cc: Likewise.
* testsuite/23_containers/list/modifiers/erase/54577.cc: Likewise.
* testsuite/23_containers/vector/bool/modifiers/erase/54577.cc:
Likewise.
* testsuite/23_containers/vector/modifiers/erase/54577.cc: Likewise.
* testsuite/23_containers/deque/requirements/dr438/assign_neg.cc:
Adjust dg-error line numbers.
* testsuite/23_containers/deque/requirements/dr438/
constructor_1_neg.cc: Likewise.
* testsuite/23_containers/deque/requirements/dr438/
constructor_2_neg.cc: Likewise.
* testsuite/23_containers/deque/requirements/dr438/insert_neg.cc:
Likewise.
* testsuite/23_containers/list/requirements/dr438/assign_neg.cc:
Likewise.
* testsuite/23_containers/list/requirements/dr438/
constructor_1_neg.cc: Likewise.
* testsuite/23_containers/list/requirements/dr438/
constructor_2_neg.cc: Likewise.
* testsuite/23_containers/list/requirements/dr438/
insert_neg.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
Likewise.
* testsuite/23_containers/vector/requirements/dr438/
constructor_1_neg.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/
constructor_2_neg.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
Likewise.
From-SVN: r198790
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/deque.tcc | 4 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/list.tcc | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_bvector.h | 33 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_deque.h | 26 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_iterator.h | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_list.h | 16 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_vector.h | 22 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/vector.tcc | 25 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/deque | 22 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/list | 23 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/vector | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/vstring.h | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/profile/deque | 22 | ||||
-rw-r--r-- | libstdc++-v3/include/profile/list | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/profile/vector | 10 |
15 files changed, 208 insertions, 40 deletions
diff --git a/libstdc++-v3/include/bits/deque.tcc b/libstdc++-v3/include/bits/deque.tcc index 89c5ef7..8da7358 100644 --- a/libstdc++-v3/include/bits/deque.tcc +++ b/libstdc++-v3/include/bits/deque.tcc @@ -191,7 +191,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template <typename _Tp, typename _Alloc> typename deque<_Tp, _Alloc>::iterator deque<_Tp, _Alloc>:: - erase(iterator __position) + _M_erase(iterator __position) { iterator __next = __position; ++__next; @@ -214,7 +214,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template <typename _Tp, typename _Alloc> typename deque<_Tp, _Alloc>::iterator deque<_Tp, _Alloc>:: - erase(iterator __first, iterator __last) + _M_erase(iterator __first, iterator __last) { if (__first == __last) return __first; diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc index 21a6a76..9fc43cf 100644 --- a/libstdc++-v3/include/bits/list.tcc +++ b/libstdc++-v3/include/bits/list.tcc @@ -106,10 +106,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Tp, typename _Alloc> typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>:: +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else erase(iterator __position) +#endif { iterator __ret = iterator(__position._M_node->_M_next); +#if __cplusplus >= 201103L + _M_erase(__position._M_const_cast()); +#else _M_erase(__position); +#endif return __ret; } diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h index 670b1950..97424fa 100644 --- a/libstdc++-v3/include/bits/stl_bvector.h +++ b/libstdc++-v3/include/bits/stl_bvector.h @@ -308,6 +308,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _Bit_const_iterator(const _Bit_iterator& __x) : _Bit_iterator_base(__x._M_p, __x._M_offset) { } + _Bit_iterator + _M_const_cast() const + { return _Bit_iterator(_M_p, _M_offset); } + const_reference operator*() const { return _Bit_reference(_M_p, 1UL << _M_offset); } @@ -898,21 +902,22 @@ template<typename _Alloc> { --this->_M_impl._M_finish; } iterator +#if __cplusplus >= 201103L + erase(const_iterator __position) + { return _M_erase(__position._M_const_cast()); } +#else erase(iterator __position) - { - if (__position + 1 != end()) - std::copy(__position + 1, end(), __position); - --this->_M_impl._M_finish; - return __position; - } + { return _M_erase(__position); } +#endif iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) + { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); } +#else erase(iterator __first, iterator __last) - { - if (__first != __last) - _M_erase_at_end(std::copy(__last, end(), __first)); - return __first; - } + { return _M_erase(__first, __last); } +#endif void resize(size_type __new_size, bool __x = bool()) @@ -1124,6 +1129,12 @@ template<typename _Alloc> void _M_erase_at_end(iterator __pos) { this->_M_impl._M_finish = __pos; } + + iterator + _M_erase(iterator __pos); + + iterator + _M_erase(iterator __first, iterator __last); }; _GLIBCXX_END_NAMESPACE_CONTAINER diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index d07bc4d..4bea82b 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -136,6 +136,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER : _M_cur(__x._M_cur), _M_first(__x._M_first), _M_last(__x._M_last), _M_node(__x._M_node) { } + iterator + _M_const_cast() const + { return iterator(_M_cur, _M_node); } + reference operator*() const { return *_M_cur; } @@ -1562,7 +1566,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * Managing the pointer is the user's responsibility. */ iterator - erase(iterator __position); +#if __cplusplus >= 201103L + erase(const_iterator __position) + { return _M_erase(__position._M_const_cast()); } +#else + erase(iterator __position) + { return _M_erase(__position); } +#endif /** * @brief Remove a range of elements. @@ -1581,7 +1591,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * way. Managing the pointer is the user's responsibility. */ iterator - erase(iterator __first, iterator __last); +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) + { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); } +#else + erase(iterator __first, iterator __last) + { return _M_erase(__first, __last); } +#endif /** * @brief Swaps data with another %deque. @@ -1873,6 +1889,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER this->_M_impl._M_finish = __pos; } + iterator + _M_erase(iterator __pos); + + iterator + _M_erase(iterator __first, iterator __last); + #if __cplusplus >= 201103L // Called by resize(sz). void diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 214f37f..a276230 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -63,6 +63,7 @@ #include <bits/cpp_type_traits.h> #include <ext/type_traits.h> #include <bits/move.h> +#include <ext/cast.h> namespace std _GLIBCXX_VISIBILITY(default) { @@ -733,6 +734,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Container>::__type>& __i) : _M_current(__i.base()) { } + __normal_iterator<typename _Container::pointer, _Container> + _M_const_cast() const + { return __normal_iterator<typename _Container::pointer, _Container> + (__gnu_cxx::__const_pointer_cast<typename _Container::pointer> + (_M_current)); } + // Forward iterator requirements reference operator*() const diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index 596760c..6789471 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -219,6 +219,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _List_const_iterator(const iterator& __x) : _M_node(__x._M_node) { } + iterator + _M_const_cast() const + { return iterator(const_cast<__detail::_List_node_base*>(_M_node)); } + // Must downcast from List_node_base to _List_node to get to // _M_data. reference @@ -1169,7 +1173,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * any way. Managing the pointer is the user's responsibility. */ iterator +#if __cplusplus >= 201103L + erase(const_iterator __position); +#else erase(iterator __position); +#endif /** * @brief Remove a range of elements. @@ -1190,11 +1198,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * is the user's responsibility. */ iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { while (__first != __last) __first = erase(__first); +#if __cplusplus >= 201103L + return __last._M_const_cast(); +#else return __last; +#endif } /** diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 69c6e27..5ac5754 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -1072,7 +1072,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * the pointer is the user's responsibility. */ iterator - erase(iterator __position); +#if __cplusplus >= 201103L + erase(const_iterator __position) + { return _M_erase(__position._M_const_cast()); } +#else + erase(iterator __position) + { return _M_erase(__position); } +#endif /** * @brief Remove a range of elements. @@ -1093,7 +1099,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * Managing the pointer is the user's responsibility. */ iterator - erase(iterator __first, iterator __last); +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) + { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); } +#else + erase(iterator __first, iterator __last) + { return _M_erase(__first, __last); } +#endif /** * @brief Swaps data with another %vector. @@ -1353,6 +1365,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER this->_M_impl._M_finish = __pos; } + iterator + _M_erase(iterator __position); + + iterator + _M_erase(iterator __first, iterator __last); + #if __cplusplus >= 201103L private: // Constant-time move assignment when source object's memory can be diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index 0882fe6..d26cfaf 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -132,7 +132,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Tp, typename _Alloc> typename vector<_Tp, _Alloc>::iterator vector<_Tp, _Alloc>:: - erase(iterator __position) + _M_erase(iterator __position) { if (__position + 1 != end()) _GLIBCXX_MOVE3(__position + 1, end(), __position); @@ -144,7 +144,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Tp, typename _Alloc> typename vector<_Tp, _Alloc>::iterator vector<_Tp, _Alloc>:: - erase(iterator __first, iterator __last) + _M_erase(iterator __first, iterator __last) { if (__first != __last) { @@ -790,6 +790,27 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER } } + template<typename _Alloc> + typename vector<bool, _Alloc>::iterator + vector<bool, _Alloc>:: + _M_erase(iterator __position) + { + if (__position + 1 != end()) + std::copy(__position + 1, end(), __position); + --this->_M_impl._M_finish; + return __position; + } + + template<typename _Alloc> + typename vector<bool, _Alloc>::iterator + vector<bool, _Alloc>:: + _M_erase(iterator __first, iterator __last) + { + if (__first != __last) + _M_erase_at_end(std::copy(__last, end(), __first)); + return __first; + } + #if __cplusplus >= 201103L template<typename _Alloc> bool diff --git a/libstdc++-v3/include/debug/deque b/libstdc++-v3/include/debug/deque index 8442ec1..2ac6d25 100644 --- a/libstdc++-v3/include/debug/deque +++ b/libstdc++-v3/include/debug/deque @@ -456,11 +456,19 @@ namespace __debug } iterator - erase(iterator __position) +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else + erase(iterator __position) +#endif { __glibcxx_check_erase(__position); +#if __cplusplus >= 201103L + _Base_const_iterator __victim = __position.base(); +#else _Base_iterator __victim = __position.base(); - if (__victim == _Base::begin() || __victim == _Base::end()-1) +#endif + if (__victim == _Base::begin() || __victim == _Base::end() - 1) { this->_M_invalidate_if(_Equal(__victim)); return iterator(_Base::erase(__victim), this); @@ -474,19 +482,27 @@ namespace __debug } iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container __glibcxx_check_erase_range(__first, __last); if (__first.base() == __last.base()) +#if __cplusplus >= 201103L + return iterator(__first.base()._M_const_cast(), this); +#else return __first; +#endif else if (__first.base() == _Base::begin() || __last.base() == _Base::end()) { this->_M_detach_singular(); - for (_Base_iterator __position = __first.base(); + for (_Base_const_iterator __position = __first.base(); __position != __last.base(); ++__position) { this->_M_invalidate_if(_Equal(__position)); diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index 8fcc5bf..9bc4712 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -431,35 +431,48 @@ namespace __debug private: _Base_iterator +#if __cplusplus >= 201103L + _M_erase(_Base_const_iterator __position) +#else _M_erase(_Base_iterator __position) +#endif { this->_M_invalidate_if(_Equal(__position)); return _Base::erase(__position); } + public: iterator +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else erase(iterator __position) +#endif { __glibcxx_check_erase(__position); return iterator(_M_erase(__position.base()), this); } iterator - erase(iterator __position, iterator __last) +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else + erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container - __glibcxx_check_erase_range(__position, __last); - for (_Base_iterator __victim = __position.base(); + __glibcxx_check_erase_range(__first, __last); + for (_Base_const_iterator __victim = __first.base(); __victim != __last.base(); ++__victim) { _GLIBCXX_DEBUG_VERIFY(__victim != _Base::end(), _M_message(__gnu_debug::__msg_valid_range) - ._M_iterator(__position, "position") + ._M_iterator(__first, "position") ._M_iterator(__last, "last")); this->_M_invalidate_if(_Equal(__victim)); } - return iterator(_Base::erase(__position.base(), __last.base()), this); + return iterator(_Base::erase(__first.base(), __last.base()), this); } void diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector index 8473686..4a65518 100644 --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -514,7 +514,11 @@ namespace __debug } iterator +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else erase(iterator __position) +#endif { __glibcxx_check_erase(__position); difference_type __offset = __position.base() - _Base::begin(); @@ -524,7 +528,11 @@ namespace __debug } iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container @@ -539,7 +547,11 @@ namespace __debug return iterator(__res, this); } else +#if __cplusplus >= 201103L + return iterator(__first.base()._M_const_cast(), this); +#else return __first; +#endif } void diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h index d46a996..716d145 100644 --- a/libstdc++-v3/include/ext/vstring.h +++ b/libstdc++-v3/include/ext/vstring.h @@ -1128,7 +1128,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * value of the string doesn't change if an error is thrown. */ iterator - erase(iterator __position) +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else + erase(iterator __position) +#endif { _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin() && __position < _M_iend()); @@ -1149,7 +1153,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * is thrown. */ iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { _GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last && __last <= _M_iend()); diff --git a/libstdc++-v3/include/profile/deque b/libstdc++-v3/include/profile/deque index 5982684..9943e1e 100644 --- a/libstdc++-v3/include/profile/deque +++ b/libstdc++-v3/include/profile/deque @@ -379,25 +379,25 @@ namespace __profile } iterator - erase(iterator __position) +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else + erase(iterator __position) +#endif { - if (__position == begin() || __position == end()-1) - { - return iterator(_Base::erase(__position)); - } - else - { - typename _Base::iterator __res = _Base::erase(__position); - return iterator(__res); - } + return _Base::erase(__position); } iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container - return iterator(_Base::erase(__first, __last)); + return _Base::erase(__first, __last); } void diff --git a/libstdc++-v3/include/profile/list b/libstdc++-v3/include/profile/list index 2870c4f..25ad112 100644 --- a/libstdc++-v3/include/profile/list +++ b/libstdc++-v3/include/profile/list @@ -389,11 +389,19 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > } iterator +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else erase(iterator __position) +#endif { return iterator(_Base::erase(__position.base()), this); } iterator +#if __cplusplus >= 201103L + erase(const_iterator __position, const_iterator __last) +#else erase(iterator __position, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container diff --git a/libstdc++-v3/include/profile/vector b/libstdc++-v3/include/profile/vector index 74a3030..d9eb157 100644 --- a/libstdc++-v3/include/profile/vector +++ b/libstdc++-v3/include/profile/vector @@ -425,14 +425,22 @@ namespace __profile iterator - erase(iterator __position) +#if __cplusplus >= 201103L + erase(const_iterator __position) +#else + erase(iterator __position) +#endif { typename _Base::iterator __res = _Base::erase(__position.base()); return iterator(__res, this); } iterator +#if __cplusplus >= 201103L + erase(const_iterator __first, const_iterator __last) +#else erase(iterator __first, iterator __last) +#endif { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container |