forked from OSchip/llvm-project
Apply a similar fix to <forward_list> as I did for <list> in r215210. Again, thanks to Ion Gaztañaga for noticing this problem w.r.t LWG#526
llvm-svn: 215213
This commit is contained in:
parent
9ccd52f5b5
commit
99d2df956d
|
@ -1421,6 +1421,7 @@ template <class _Tp, class _Alloc>
|
|||
void
|
||||
forward_list<_Tp, _Alloc>::remove(const value_type& __v)
|
||||
{
|
||||
forward_list<_Tp, _Alloc> __deleted_nodes; // collect the nodes we're removing
|
||||
iterator __e = end();
|
||||
for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;)
|
||||
{
|
||||
|
@ -1429,7 +1430,7 @@ forward_list<_Tp, _Alloc>::remove(const value_type& __v)
|
|||
iterator __j = _VSTD::next(__i, 2);
|
||||
for (; __j != __e && *__j == __v; ++__j)
|
||||
;
|
||||
erase_after(__i, __j);
|
||||
__deleted_nodes.splice_after(__deleted_nodes.before_begin(), *this, __i, __j);
|
||||
if (__j == __e)
|
||||
break;
|
||||
__i = __j;
|
||||
|
|
|
@ -17,6 +17,17 @@
|
|||
|
||||
#include "min_allocator.h"
|
||||
|
||||
struct S {
|
||||
S(int i) : i_(new int(i)) {}
|
||||
S(const S &rhs) : i_(new int(*rhs.i_)) {}
|
||||
S& operator = (const S &rhs) { *i_ = *rhs.i_; return *this; }
|
||||
~S () { delete i_; i_ = NULL; }
|
||||
bool operator == (const S &rhs) const { return *i_ == *rhs.i_; }
|
||||
int get () const { return *i_; }
|
||||
int *i_;
|
||||
};
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
|
@ -66,6 +77,32 @@ int main()
|
|||
c1.remove(0);
|
||||
assert(c1 == c2);
|
||||
}
|
||||
{ // LWG issue #526
|
||||
typedef int T;
|
||||
typedef std::forward_list<T> C;
|
||||
int t1[] = {1, 2, 1, 3, 5, 8, 11};
|
||||
int t2[] = { 2, 3, 5, 8, 11};
|
||||
C c1(std::begin(t1), std::end(t1));
|
||||
C c2(std::begin(t2), std::end(t2));
|
||||
c1.remove(c1.front());
|
||||
assert(c1 == c2);
|
||||
}
|
||||
{
|
||||
typedef S T;
|
||||
typedef std::forward_list<T> C;
|
||||
int t1[] = {1, 2, 1, 3, 5, 8, 11, 1};
|
||||
int t2[] = { 2, 3, 5, 8, 11 };
|
||||
C c;
|
||||
for(int *ip = std::end(t1); ip != std::begin(t1);)
|
||||
c.push_front(S(*--ip));
|
||||
c.remove(c.front());
|
||||
C::const_iterator it = c.begin();
|
||||
for(int *ip = std::begin(t2); ip != std::end(t2); ++ip, ++it) {
|
||||
assert ( it != c.end());
|
||||
assert ( *ip == it->get());
|
||||
}
|
||||
assert ( it == c.end ());
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
typedef int T;
|
||||
|
|
Loading…
Reference in New Issue