From fadecc62c0ea4e1caac4bbb9570331060a299134 Mon Sep 17 00:00:00 2001 From: redi Date: Wed, 7 May 2014 15:05:22 +0000 Subject: PR libstdc++/61086 * include/bits/stl_iterator.h (__normal_iterator::_M_const_cast): Remove. * include/bits/stl_vector.h (vector::insert, vector::erase): Use arithmetic to obtain a mutable iterator from const_iterator. * include/bits/vector.tcc (vector::insert): Likewise. * include/debug/vector (vector::erase): Likewise. * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Adjust dg-error line number. * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@210163 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 16 ++++++++++++++++ libstdc++-v3/include/bits/stl_iterator.h | 15 --------------- libstdc++-v3/include/bits/stl_vector.h | 14 ++++++++++---- libstdc++-v3/include/bits/vector.tcc | 9 ++++++--- libstdc++-v3/include/debug/vector | 2 +- .../vector/requirements/dr438/assign_neg.cc | 2 +- .../vector/requirements/dr438/constructor_1_neg.cc | 2 +- .../vector/requirements/dr438/constructor_2_neg.cc | 2 +- .../vector/requirements/dr438/insert_neg.cc | 2 +- 9 files changed, 37 insertions(+), 27 deletions(-) (limited to 'libstdc++-v3') diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9a5505eb236..2e400b5ac5f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -5,6 +5,22 @@ comparison function. * testsuite/23_containers/set/cons/61023.cc: New. + PR libstdc++/61086 + * include/bits/stl_iterator.h (__normal_iterator::_M_const_cast): + Remove. + * include/bits/stl_vector.h (vector::insert, vector::erase): Use + arithmetic to obtain a mutable iterator from const_iterator. + * include/bits/vector.tcc (vector::insert): Likewise. + * include/debug/vector (vector::erase): Likewise. + * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: + Adjust dg-error line number. + * 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. + 2014-05-06 Jonathan Wakely Backport from mainline diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 1d2a52419d9..aa3581e330f 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -736,21 +736,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Container>::__type>& __i) _GLIBCXX_NOEXCEPT : _M_current(__i.base()) { } -#if __cplusplus >= 201103L - __normal_iterator - _M_const_cast() const noexcept - { - using _PTraits = std::pointer_traits; - return __normal_iterator - (_PTraits::pointer_to(const_cast - (*_M_current))); - } -#else - __normal_iterator - _M_const_cast() const - { return *this; } -#endif - // Forward iterator requirements reference operator*() const _GLIBCXX_NOEXCEPT diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 7e52fde55b1..c33e2c6ae30 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -1051,7 +1051,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER insert(const_iterator __position, size_type __n, const value_type& __x) { difference_type __offset = __position - cbegin(); - _M_fill_insert(__position._M_const_cast(), __n, __x); + _M_fill_insert(begin() + __offset, __n, __x); return begin() + __offset; } #else @@ -1096,7 +1096,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _InputIterator __last) { difference_type __offset = __position - cbegin(); - _M_insert_dispatch(__position._M_const_cast(), + _M_insert_dispatch(begin() + __offset, __first, __last, __false_type()); return begin() + __offset; } @@ -1144,10 +1144,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER iterator #if __cplusplus >= 201103L erase(const_iterator __position) + { return _M_erase(begin() + (__position - cbegin())); } #else erase(iterator __position) + { return _M_erase(__position); } #endif - { return _M_erase(__position._M_const_cast()); } /** * @brief Remove a range of elements. @@ -1170,10 +1171,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER iterator #if __cplusplus >= 201103L erase(const_iterator __first, const_iterator __last) + { + const auto __beg = begin(); + const auto __cbeg = cbegin(); + return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg)); + } #else erase(iterator __first, iterator __last) + { return _M_erase(__first, __last); } #endif - { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); } /** * @brief Swaps data with another %vector. diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index 1eff51447a1..c937b3887d7 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -121,14 +121,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER else { #if __cplusplus >= 201103L + const auto __pos = begin() + (__position - cbegin()); if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) { _Tp __x_copy = __x; - _M_insert_aux(__position._M_const_cast(), std::move(__x_copy)); + _M_insert_aux(__pos, std::move(__x_copy)); } else + _M_insert_aux(__pos, __x); +#else + _M_insert_aux(__position, __x); #endif - _M_insert_aux(__position._M_const_cast(), __x); } return iterator(this->_M_impl._M_start + __n); } @@ -307,7 +310,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ++this->_M_impl._M_finish; } else - _M_insert_aux(__position._M_const_cast(), + _M_insert_aux(begin() + (__position - cbegin()), std::forward<_Args>(__args)...); return iterator(this->_M_impl._M_start + __n); } diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector index 2e9cd656b5c..f7f54eeda2e 100644 --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -602,7 +602,7 @@ namespace __debug } else #if __cplusplus >= 201103L - return iterator(__first.base()._M_const_cast(), this); + return begin() + (__first.base() - cbegin().base()); #else return __first; #endif diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc index 191fbc7bfdb..655c7e8ad46 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1320 } +// { dg-error "no matching" "" { target *-*-* } 1326 } #include diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc index 8818a88ccd7..d938aa21bf2 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1246 } +// { dg-error "no matching" "" { target *-*-* } 1252 } #include diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc index 09499bcbad7..f88828562e9 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1246 } +// { dg-error "no matching" "" { target *-*-* } 1252 } #include #include diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc index 674e3b5d6e5..316249b0188 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1361 } +// { dg-error "no matching" "" { target *-*-* } 1367 } #include -- cgit v1.2.1