re PR libstdc++/17012 ([DR 526] std::list's function, remove, looks like it is reading memory that has been freed.)

2007-02-08  Howard Hinnant  <hhinnant@apple.com>

	PR libstdc++/17012
	* include/bits/list.tcc (list<>::remove): Take care of
	&*__first == &__value.
	* docs/html/ext/howto.html: Add an entry for DR 526.

From-SVN: r121735
This commit is contained in:
Howard Hinnant 2007-02-09 01:00:25 +00:00 committed by Paolo Carlini
parent 67e1d0f75c
commit 687e00ee8a
3 changed files with 27 additions and 2 deletions

View file

@ -1,3 +1,10 @@
2007-02-08 Howard Hinnant <hhinnant@apple.com>
PR libstdc++/17012
* include/bits/list.tcc (list<>::remove): Take care of
&*__first == &__value.
* docs/html/ext/howto.html: Add an entry for DR 526.
2007-02-07 Jakub Jelinek <jakub@redhat.com>
PR libgomp/28468

View file

@ -586,6 +586,13 @@
<dd>Construct a <code>linear_congruential</code> engine and seed with it.
</dd>
<dt><a href="lwg-active.html#526">526</a>:
<em>Is it undefined if a function in the standard changes in
parameters?</em>
</dt>
<dd>Use &amp;value.
</dd>
<dt><a href="lwg-defects.html#538">538</a>:
<em>241 again: Does unique_copy() require CopyConstructible
and Assignable?</em>

View file

@ -1,6 +1,6 @@
// List implementation (out of line) -*- C++ -*-
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@ -176,14 +176,25 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
{
iterator __first = begin();
iterator __last = end();
iterator __extra = __last;
while (__first != __last)
{
iterator __next = __first;
++__next;
if (*__first == __value)
_M_erase(__first);
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 526. Is it undefined if a function in the standard changes
// in parameters?
if (&*__first != &__value)
_M_erase(__first);
else
__extra = __first;
}
__first = __next;
}
if (__extra != __last)
_M_erase(__extra);
}
template<typename _Tp, typename _Alloc>