aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/ChangeLog58
-rw-r--r--libstdc++-v3/include/bits/deque.tcc4
-rw-r--r--libstdc++-v3/include/bits/list.tcc8
-rw-r--r--libstdc++-v3/include/bits/stl_bvector.h33
-rw-r--r--libstdc++-v3/include/bits/stl_deque.h26
-rw-r--r--libstdc++-v3/include/bits/stl_iterator.h7
-rw-r--r--libstdc++-v3/include/bits/stl_list.h16
-rw-r--r--libstdc++-v3/include/bits/stl_vector.h22
-rw-r--r--libstdc++-v3/include/bits/vector.tcc25
-rw-r--r--libstdc++-v3/include/debug/deque22
-rw-r--r--libstdc++-v3/include/debug/list23
-rw-r--r--libstdc++-v3/include/debug/vector12
-rw-r--r--libstdc++-v3/include/ext/vstring.h10
-rw-r--r--libstdc++-v3/include/profile/deque22
-rw-r--r--libstdc++-v3/include/profile/list8
-rw-r--r--libstdc++-v3/include/profile/vector10
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/modifiers/erase/54577.cc33
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/modifiers/erase/54577.cc33
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/erase/54577.cc33
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/54577.cc33
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/ext/vstring/modifiers/char/54577.cc33
-rw-r--r--libstdc++-v3/testsuite/ext/vstring/modifiers/wchar_t/54577.cc33
-rw-r--r--libstdc++-v3/testsuite/util/exception/safety.h48
35 files changed, 480 insertions, 96 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index a835e37..31d9ae2 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,61 @@
+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.
+
2013-05-09 Uros Bizjak <ubizjak@gmail.com>
* testsuite/util/testsuite_abi.cc (check_version): Add CXXABI_1.3.8.
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
diff --git a/libstdc++-v3/testsuite/23_containers/deque/modifiers/erase/54577.cc b/libstdc++-v3/testsuite/23_containers/deque/modifiers/erase/54577.cc
new file mode 100644
index 0000000..9553e11
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/deque/modifiers/erase/54577.cc
@@ -0,0 +1,33 @@
+// { dg-options "-std=gnu++11" }
+// { 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/>.
+
+#include <deque>
+
+void test01()
+{
+ std::deque<int> d1;
+ d1.push_back(1);
+ d1.erase(d1.cbegin());
+
+ std::deque<int> d2;
+ d2.push_back(2);
+ d2.push_back(3);
+ d2.erase(d2.cbegin(), d2.cend());
+}
diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc
index e360c46..ccb63ef 100644
--- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1698 }
+// { dg-error "no matching" "" { target *-*-* } 1714 }
#include <deque>
diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc
index 814620f..0a5db63 100644
--- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1631 }
+// { dg-error "no matching" "" { target *-*-* } 1647 }
#include <deque>
diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc
index 3cf7ed0..7572322 100644
--- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1631 }
+// { dg-error "no matching" "" { target *-*-* } 1647 }
#include <deque>
#include <utility>
diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc
index 358791e..b109d38 100644
--- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1782 }
+// { dg-error "no matching" "" { target *-*-* } 1798 }
#include <deque>
diff --git a/libstdc++-v3/testsuite/23_containers/list/modifiers/erase/54577.cc b/libstdc++-v3/testsuite/23_containers/list/modifiers/erase/54577.cc
new file mode 100644
index 0000000..7df79fb
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/list/modifiers/erase/54577.cc
@@ -0,0 +1,33 @@
+// { dg-options "-std=gnu++11" }
+// { 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/>.
+
+#include <list>
+
+void test01()
+{
+ std::list<int> l1;
+ l1.push_back(1);
+ l1.erase(l1.cbegin());
+
+ std::list<int> l2;
+ l2.push_back(2);
+ l2.push_back(3);
+ l2.erase(l2.cbegin(), l2.cend());
+}
diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc
index 63216cb..4ccd652 100644
--- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1529 }
+// { dg-error "no matching" "" { target *-*-* } 1545 }
#include <list>
diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc
index bff5fb7..6bc01b7 100644
--- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1481 }
+// { dg-error "no matching" "" { target *-*-* } 1497 }
#include <list>
diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc
index 45e8905..1f39056 100644
--- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1481 }
+// { dg-error "no matching" "" { target *-*-* } 1497 }
#include <list>
#include <utility>
diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc
index d34465a..902f55a 100644
--- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1481 }
+// { dg-error "no matching" "" { target *-*-* } 1497 }
#include <list>
diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/erase/54577.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/erase/54577.cc
new file mode 100644
index 0000000..ed18f6a
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/erase/54577.cc
@@ -0,0 +1,33 @@
+// { dg-options "-std=gnu++11" }
+// { 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/>.
+
+#include <vector>
+
+void test01()
+{
+ std::vector<bool> vb1;
+ vb1.push_back(true);
+ vb1.erase(vb1.cbegin());
+
+ std::vector<bool> vb2;
+ vb2.push_back(false);
+ vb2.push_back(true);
+ vb2.erase(vb2.cbegin(), vb2.cend());
+}
diff --git a/libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/54577.cc b/libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/54577.cc
new file mode 100644
index 0000000..64a87ea
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/54577.cc
@@ -0,0 +1,33 @@
+// { dg-options "-std=gnu++11" }
+// { 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/>.
+
+#include <vector>
+
+void test01()
+{
+ std::vector<int> v1;
+ v1.push_back(1);
+ v1.erase(v1.cbegin());
+
+ std::vector<int> v2;
+ v2.push_back(2);
+ v2.push_back(3);
+ v2.erase(v2.cbegin(), v2.cend());
+}
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 64e4665..2dbc602 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 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1240 }
+// { dg-error "no matching" "" { target *-*-* } 1252 }
#include <vector>
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 b4e881d..7fc56bd 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 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1166 }
+// { dg-error "no matching" "" { target *-*-* } 1178 }
#include <vector>
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 74bea14..6a37461 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 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1166 }
+// { dg-error "no matching" "" { target *-*-* } 1178 }
#include <vector>
#include <utility>
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 a8d98cb..3f5abb9 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 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1281 }
+// { dg-error "no matching" "" { target *-*-* } 1293 }
#include <vector>
diff --git a/libstdc++-v3/testsuite/ext/vstring/modifiers/char/54577.cc b/libstdc++-v3/testsuite/ext/vstring/modifiers/char/54577.cc
new file mode 100644
index 0000000..979828b
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/vstring/modifiers/char/54577.cc
@@ -0,0 +1,33 @@
+// { dg-options "-std=gnu++11" }
+// { 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/>.
+
+#include <ext/vstring.h>
+
+void test01()
+{
+ __gnu_cxx::__vstring vs1;
+ vs1.push_back('1');
+ vs1.erase(vs1.cbegin());
+
+ __gnu_cxx::__vstring vs2;
+ vs2.push_back('2');
+ vs2.push_back('3');
+ vs2.erase(vs2.cbegin(), vs2.cend());
+}
diff --git a/libstdc++-v3/testsuite/ext/vstring/modifiers/wchar_t/54577.cc b/libstdc++-v3/testsuite/ext/vstring/modifiers/wchar_t/54577.cc
new file mode 100644
index 0000000..f514099
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/vstring/modifiers/wchar_t/54577.cc
@@ -0,0 +1,33 @@
+// { dg-options "-std=gnu++11" }
+// { 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/>.
+
+#include <ext/vstring.h>
+
+void test01()
+{
+ __gnu_cxx::__wvstring wvs1;
+ wvs1.push_back(L'1');
+ wvs1.erase(wvs1.cbegin());
+
+ __gnu_cxx::__wvstring wvs2;
+ wvs2.push_back(L'2');
+ wvs2.push_back(L'3');
+ wvs2.erase(wvs2.cbegin(), wvs2.cend());
+}
diff --git a/libstdc++-v3/testsuite/util/exception/safety.h b/libstdc++-v3/testsuite/util/exception/safety.h
index 7903236..c063c9b 100644
--- a/libstdc++-v3/testsuite/util/exception/safety.h
+++ b/libstdc++-v3/testsuite/util/exception/safety.h
@@ -287,51 +287,11 @@ namespace __gnu_test
typedef __gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4>
container_type;
typedef typename container_type::iterator iterator;
+ typedef typename container_type::const_iterator const_iterator;
- iterator (container_type::* _F_erase_point)(iterator);
- iterator (container_type::* _F_erase_range)(iterator, iterator);
-
- erase_base()
- : _F_erase_point(&container_type::erase),
- _F_erase_range(&container_type::erase) { }
- };
-
- template<typename _Tp1, typename _Tp2>
- struct erase_base<std::deque<_Tp1, _Tp2>>
- {
- typedef std::deque<_Tp1, _Tp2> container_type;
- typedef typename container_type::iterator iterator;
-
- iterator (container_type::* _F_erase_point)(iterator);
- iterator (container_type::* _F_erase_range)(iterator, iterator);
-
- erase_base()
- : _F_erase_point(&container_type::erase),
- _F_erase_range(&container_type::erase) { }
- };
-
- template<typename _Tp1, typename _Tp2>
- struct erase_base<std::list<_Tp1, _Tp2>>
- {
- typedef std::list<_Tp1, _Tp2> container_type;
- typedef typename container_type::iterator iterator;
-
- iterator (container_type::* _F_erase_point)(iterator);
- iterator (container_type::* _F_erase_range)(iterator, iterator);
-
- erase_base()
- : _F_erase_point(&container_type::erase),
- _F_erase_range(&container_type::erase) { }
- };
-
- template<typename _Tp1, typename _Tp2>
- struct erase_base<std::vector<_Tp1, _Tp2>>
- {
- typedef std::vector<_Tp1, _Tp2> container_type;
- typedef typename container_type::iterator iterator;
-
- iterator (container_type::* _F_erase_point)(iterator);
- iterator (container_type::* _F_erase_range)(iterator, iterator);
+ iterator (container_type::* _F_erase_point)(const_iterator);
+ iterator (container_type::* _F_erase_range)(const_iterator,
+ const_iterator);
erase_base()
: _F_erase_point(&container_type::erase),