aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2007-02-09 01:00:25 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2007-02-09 01:00:25 +0000
commit687e00ee8a88d034fb91a9eecb611b5927c5f677 (patch)
treee27caee4bafbee23a1d74d1e66f4c317f0ef8ac7
parent67e1d0f75c48f8df151297829f56282a8d168f29 (diff)
downloadgcc-687e00ee8a88d034fb91a9eecb611b5927c5f677.zip
gcc-687e00ee8a88d034fb91a9eecb611b5927c5f677.tar.gz
gcc-687e00ee8a88d034fb91a9eecb611b5927c5f677.tar.bz2
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
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/docs/html/ext/howto.html7
-rw-r--r--libstdc++-v3/include/bits/list.tcc15
3 files changed, 27 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 1610a60..1effedd 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
diff --git a/libstdc++-v3/docs/html/ext/howto.html b/libstdc++-v3/docs/html/ext/howto.html
index 951e108..c3dcca4 100644
--- a/libstdc++-v3/docs/html/ext/howto.html
+++ b/libstdc++-v3/docs/html/ext/howto.html
@@ -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>
diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc
index f2849fb..6bde3b7 100644
--- a/libstdc++-v3/include/bits/list.tcc
+++ b/libstdc++-v3/include/bits/list.tcc
@@ -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>