mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-25 07:55:30 +08:00
re PR libstdc++/61086 (ubsan detects undefined behaviour in the standard library)
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. From-SVN: r210162
This commit is contained in:
parent
ef2662bf65
commit
bbf264c9b2
@ -5,6 +5,22 @@
|
|||||||
comparison function.
|
comparison function.
|
||||||
* testsuite/23_containers/set/cons/61023.cc: New.
|
* 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 Paolo Carlini <paolo.carlini@oracle.com>
|
2014-05-06 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
* include/Makefile.in: Regenerate.
|
* include/Makefile.in: Regenerate.
|
||||||
|
@ -736,21 +736,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||||||
_Container>::__type>& __i) _GLIBCXX_NOEXCEPT
|
_Container>::__type>& __i) _GLIBCXX_NOEXCEPT
|
||||||
: _M_current(__i.base()) { }
|
: _M_current(__i.base()) { }
|
||||||
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
__normal_iterator<typename _Container::pointer, _Container>
|
|
||||||
_M_const_cast() const noexcept
|
|
||||||
{
|
|
||||||
using _PTraits = std::pointer_traits<typename _Container::pointer>;
|
|
||||||
return __normal_iterator<typename _Container::pointer, _Container>
|
|
||||||
(_PTraits::pointer_to(const_cast<typename _PTraits::element_type&>
|
|
||||||
(*_M_current)));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
__normal_iterator
|
|
||||||
_M_const_cast() const
|
|
||||||
{ return *this; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Forward iterator requirements
|
// Forward iterator requirements
|
||||||
reference
|
reference
|
||||||
operator*() const _GLIBCXX_NOEXCEPT
|
operator*() const _GLIBCXX_NOEXCEPT
|
||||||
|
@ -1051,7 +1051,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
|||||||
insert(const_iterator __position, size_type __n, const value_type& __x)
|
insert(const_iterator __position, size_type __n, const value_type& __x)
|
||||||
{
|
{
|
||||||
difference_type __offset = __position - cbegin();
|
difference_type __offset = __position - cbegin();
|
||||||
_M_fill_insert(__position._M_const_cast(), __n, __x);
|
_M_fill_insert(begin() + __offset, __n, __x);
|
||||||
return begin() + __offset;
|
return begin() + __offset;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -1096,7 +1096,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
|||||||
_InputIterator __last)
|
_InputIterator __last)
|
||||||
{
|
{
|
||||||
difference_type __offset = __position - cbegin();
|
difference_type __offset = __position - cbegin();
|
||||||
_M_insert_dispatch(__position._M_const_cast(),
|
_M_insert_dispatch(begin() + __offset,
|
||||||
__first, __last, __false_type());
|
__first, __last, __false_type());
|
||||||
return begin() + __offset;
|
return begin() + __offset;
|
||||||
}
|
}
|
||||||
@ -1144,10 +1144,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
|||||||
iterator
|
iterator
|
||||||
#if __cplusplus >= 201103L
|
#if __cplusplus >= 201103L
|
||||||
erase(const_iterator __position)
|
erase(const_iterator __position)
|
||||||
|
{ return _M_erase(begin() + (__position - cbegin())); }
|
||||||
#else
|
#else
|
||||||
erase(iterator __position)
|
erase(iterator __position)
|
||||||
|
{ return _M_erase(__position); }
|
||||||
#endif
|
#endif
|
||||||
{ return _M_erase(__position._M_const_cast()); }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Remove a range of elements.
|
* @brief Remove a range of elements.
|
||||||
@ -1170,10 +1171,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
|||||||
iterator
|
iterator
|
||||||
#if __cplusplus >= 201103L
|
#if __cplusplus >= 201103L
|
||||||
erase(const_iterator __first, const_iterator __last)
|
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
|
#else
|
||||||
erase(iterator __first, iterator __last)
|
erase(iterator __first, iterator __last)
|
||||||
|
{ return _M_erase(__first, __last); }
|
||||||
#endif
|
#endif
|
||||||
{ return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Swaps data with another %vector.
|
* @brief Swaps data with another %vector.
|
||||||
|
@ -121,14 +121,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if __cplusplus >= 201103L
|
#if __cplusplus >= 201103L
|
||||||
|
const auto __pos = begin() + (__position - cbegin());
|
||||||
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
|
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
|
||||||
{
|
{
|
||||||
_Tp __x_copy = __x;
|
_Tp __x_copy = __x;
|
||||||
_M_insert_aux(__position._M_const_cast(), std::move(__x_copy));
|
_M_insert_aux(__pos, std::move(__x_copy));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
_M_insert_aux(__pos, __x);
|
||||||
|
#else
|
||||||
|
_M_insert_aux(__position, __x);
|
||||||
#endif
|
#endif
|
||||||
_M_insert_aux(__position._M_const_cast(), __x);
|
|
||||||
}
|
}
|
||||||
return iterator(this->_M_impl._M_start + __n);
|
return iterator(this->_M_impl._M_start + __n);
|
||||||
}
|
}
|
||||||
@ -307,7 +310,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
|||||||
++this->_M_impl._M_finish;
|
++this->_M_impl._M_finish;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_M_insert_aux(__position._M_const_cast(),
|
_M_insert_aux(begin() + (__position - cbegin()),
|
||||||
std::forward<_Args>(__args)...);
|
std::forward<_Args>(__args)...);
|
||||||
return iterator(this->_M_impl._M_start + __n);
|
return iterator(this->_M_impl._M_start + __n);
|
||||||
}
|
}
|
||||||
|
@ -647,7 +647,7 @@ namespace __debug
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#if __cplusplus >= 201103L
|
#if __cplusplus >= 201103L
|
||||||
return iterator(__first.base()._M_const_cast(), this);
|
return begin() + (__first.base() - cbegin().base());
|
||||||
#else
|
#else
|
||||||
return __first;
|
return __first;
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// { dg-do compile }
|
// { dg-do compile }
|
||||||
// { dg-error "no matching" "" { target *-*-* } 1320 }
|
// { dg-error "no matching" "" { target *-*-* } 1326 }
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// { dg-do compile }
|
// { dg-do compile }
|
||||||
// { dg-error "no matching" "" { target *-*-* } 1246 }
|
// { dg-error "no matching" "" { target *-*-* } 1252 }
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// { dg-do compile }
|
// { dg-do compile }
|
||||||
// { dg-error "no matching" "" { target *-*-* } 1246 }
|
// { dg-error "no matching" "" { target *-*-* } 1252 }
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// { dg-do compile }
|
// { dg-do compile }
|
||||||
// { dg-error "no matching" "" { target *-*-* } 1361 }
|
// { dg-error "no matching" "" { target *-*-* } 1367 }
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user