Pull in r214736 from upstream libc++ trunk (by Marshall Clow):

Fix PR#20520 - predicate called too many times in list::remove_if.
  Add tests for list, forward_list, and the std::remove_if algorithm

This fixes an issue where std::list<>::remove_if() and remove() could
erroneously visit elements twice.

Reported by:	Dominic Fandrey <kamikaze@bsdforen.de>
PR:		192303
MFC after:	3 days
This commit is contained in:
Dimitry Andric 2014-08-08 21:27:33 +00:00
parent 6b6e7079b3
commit f48026fc69

View File

@ -2046,6 +2046,8 @@ list<_Tp, _Alloc>::remove(const value_type& __x)
for (; __j != __e && *__j == __x; ++__j)
;
__i = erase(__i, __j);
if (__i != __e)
__i = _VSTD::next(__i);
}
else
++__i;
@ -2065,6 +2067,8 @@ list<_Tp, _Alloc>::remove_if(_Pred __pred)
for (; __j != __e && __pred(*__j); ++__j)
;
__i = erase(__i, __j);
if (__i != __e)
__i = _VSTD::next(__i);
}
else
++__i;