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:
parent
6b6e7079b3
commit
f48026fc69
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user