From 03e38c1a18eb37aad31cc3cc9318eca50a8dff89 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 7 Feb 2011 20:15:48 +0000 Subject: [PATCH] re PR libstdc++/47628 (non-compliant C++0x erase methods on STL containers) 2011-02-07 Paolo Carlini PR libstdc++/47628 * include/bits/stl_tree.h (_Rb_tree::erase(iterator), erase(iterator, iterator)): Add back in C++03 mode. * testsuite/23_containers/map/modifiers/erase/47628.cc: New. * testsuite/23_containers/multimap/modifiers/erase/47628.cc: Likewise. From-SVN: r169899 --- libstdc++-v3/ChangeLog | 8 ++++ libstdc++-v3/include/bits/stl_tree.h | 10 ++++- .../map/modifiers/erase/47628.cc | 45 +++++++++++++++++++ .../multimap/modifiers/erase/47628.cc | 45 +++++++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/23_containers/map/modifiers/erase/47628.cc create mode 100644 libstdc++-v3/testsuite/23_containers/multimap/modifiers/erase/47628.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f21f4aec62e..f2d472fac07 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2011-02-07 Paolo Carlini + + PR libstdc++/47628 + * include/bits/stl_tree.h (_Rb_tree::erase(iterator), erase(iterator, + iterator)): Add back in C++03 mode. + * testsuite/23_containers/map/modifiers/erase/47628.cc: New. + * testsuite/23_containers/multimap/modifiers/erase/47628.cc: Likewise. + 2011-02-07 Benjamin Kosnik PR libstdc++/47560 try two diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h index 1960f9c8a45..85681d2da36 100644 --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -1,7 +1,7 @@ // RB tree implementation -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, -// 2009, 2010 +// 2009, 2010, 2011 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -761,6 +761,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __result._M_const_cast(); } #else + void + erase(iterator __position) + { _M_erase_aux(__position); } + void erase(const_iterator __position) { _M_erase_aux(__position); } @@ -778,6 +782,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __last._M_const_cast(); } #else + void + erase(iterator __first, iterator __last) + { _M_erase_aux(__first, __last); } + void erase(const_iterator __first, const_iterator __last) { _M_erase_aux(__first, __last); } diff --git a/libstdc++-v3/testsuite/23_containers/map/modifiers/erase/47628.cc b/libstdc++-v3/testsuite/23_containers/map/modifiers/erase/47628.cc new file mode 100644 index 00000000000..2769bcac2bf --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/map/modifiers/erase/47628.cc @@ -0,0 +1,45 @@ +// Copyright (C) 2011 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . +// + +// { dg-do compile } + +#include + +struct Key +{ + Key() { } + + Key(const Key&) { } + + template + Key(const T&) + { } + + bool operator<(const Key&) const; +}; + +typedef std::map Map; + +// libstdc++/47628 +void f() +{ + Map m; + m.insert(Map::value_type()); + Map::iterator i = m.begin(); + m.erase(i); +} diff --git a/libstdc++-v3/testsuite/23_containers/multimap/modifiers/erase/47628.cc b/libstdc++-v3/testsuite/23_containers/multimap/modifiers/erase/47628.cc new file mode 100644 index 00000000000..601b16b7d82 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/multimap/modifiers/erase/47628.cc @@ -0,0 +1,45 @@ +// Copyright (C) 2011 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . +// + +// { dg-do compile } + +#include + +struct Key +{ + Key() { } + + Key(const Key&) { } + + template + Key(const T&) + { } + + bool operator<(const Key&) const; +}; + +typedef std::multimap MMap; + +// libstdc++/47628 +void f() +{ + MMap mm; + mm.insert(MMap::value_type()); + MMap::iterator i = mm.begin(); + mm.erase(i); +}