From: paolo Date: Thu, 24 Apr 2008 17:03:13 +0000 (+0000) Subject: 2008-04-24 Paolo Carlini X-Git-Tag: upstream/4.9.2~42511 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e40f98cb51b4fec34e59d8ef5a22751f7142f589;p=platform%2Fupstream%2Flinaro-gcc.git 2008-04-24 Paolo Carlini PR libstdc++/35969 * include/debug/list (merge): Use _M_transfer_iter, consistently with the splice members. * testsuite/23_containers/list/operations/35969.cc: New. * testsuite/23_containers/list/operators: Rename to testsuite/23_containers/list/operations. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@134642 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cdf9656..8b16606 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2008-04-24 Paolo Carlini + + PR libstdc++/35969 + * include/debug/list (merge): Use _M_transfer_iter, consistently + with the splice members. + * testsuite/23_containers/list/operations/35969.cc: New. + + * testsuite/23_containers/list/operators: Rename to + testsuite/23_containers/list/operations. + 2008-04-24 Benjamin Kosnik * acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Check for set of diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index b071d4f..d0797e9 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -1,6 +1,6 @@ // Debugging list implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -527,14 +527,19 @@ namespace __debug merge(list& __x) #endif { - __glibcxx_check_sorted(_Base::begin(), _Base::end()); - __glibcxx_check_sorted(__x.begin().base(), __x.end().base()); - for (iterator __tmp = __x.begin(); __tmp != __x.end(); ) + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 300. list::merge() specification incomplete + if (this != &__x) { - iterator __victim = __tmp++; - __victim._M_attach(&__x); + __glibcxx_check_sorted(_Base::begin(), _Base::end()); + __glibcxx_check_sorted(__x.begin().base(), __x.end().base()); + for (iterator __tmp = __x.begin(); __tmp != __x.end();) + { + iterator __victim = __tmp++; + this->_M_transfer_iter(__victim); + } + _Base::merge(_GLIBCXX_MOVE(__x._M_base())); } - _Base::merge(_GLIBCXX_MOVE(__x._M_base())); } template @@ -545,15 +550,21 @@ namespace __debug merge(list& __x, _Compare __comp) #endif { - __glibcxx_check_sorted_pred(_Base::begin(), _Base::end(), __comp); - __glibcxx_check_sorted_pred(__x.begin().base(), __x.end().base(), - __comp); - for (iterator __tmp = __x.begin(); __tmp != __x.end(); ) + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 300. list::merge() specification incomplete + if (this != &__x) { - iterator __victim = __tmp++; - __victim._M_attach(&__x); + __glibcxx_check_sorted_pred(_Base::begin(), _Base::end(), + __comp); + __glibcxx_check_sorted_pred(__x.begin().base(), __x.end().base(), + __comp); + for (iterator __tmp = __x.begin(); __tmp != __x.end();) + { + iterator __victim = __tmp++; + this->_M_transfer_iter(__victim); + } + _Base::merge(_GLIBCXX_MOVE(__x._M_base()), __comp); } - _Base::merge(_GLIBCXX_MOVE(__x._M_base()), __comp); } void diff --git a/libstdc++-v3/testsuite/23_containers/list/operators/1.cc b/libstdc++-v3/testsuite/23_containers/list/operations/1.cc similarity index 100% rename from libstdc++-v3/testsuite/23_containers/list/operators/1.cc rename to libstdc++-v3/testsuite/23_containers/list/operations/1.cc diff --git a/libstdc++-v3/testsuite/23_containers/list/operators/2.cc b/libstdc++-v3/testsuite/23_containers/list/operations/2.cc similarity index 100% rename from libstdc++-v3/testsuite/23_containers/list/operators/2.cc rename to libstdc++-v3/testsuite/23_containers/list/operations/2.cc diff --git a/libstdc++-v3/testsuite/23_containers/list/operators/3.cc b/libstdc++-v3/testsuite/23_containers/list/operations/3.cc similarity index 100% rename from libstdc++-v3/testsuite/23_containers/list/operators/3.cc rename to libstdc++-v3/testsuite/23_containers/list/operations/3.cc diff --git a/libstdc++-v3/testsuite/23_containers/list/operations/35969.cc b/libstdc++-v3/testsuite/23_containers/list/operations/35969.cc new file mode 100644 index 0000000..97747ad --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/list/operations/35969.cc @@ -0,0 +1,80 @@ +// Copyright (C) 2008 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 23.2.2.4 list operations [lib.list.ops] + +// { dg-options "-D_GLIBCXX_DEBUG" } + +#include +#include + +// libstdc++/35969 +void test01() +{ + { + std::list list1; + std::list list2; + + for(int i = 0; i < 10; ++i) + { + list1.push_back(i); + list2.push_back(10 - i); + } + + list1.sort(); + list2.sort(); + + std::list::iterator node_of_interest = list2.begin(); + + list1.splice(list1.begin(), list2, node_of_interest); + list2.splice(list2.begin(), list1, node_of_interest); + + list1.merge(list2); + + list2.splice(list2.begin(), list1, node_of_interest); + } + + { + std::list list1; + std::list list2; + + for(int i = 0; i < 10; ++i) + { + list1.push_back(i); + list2.push_back(10 - i); + } + + list1.sort(); + list2.sort(); + + std::list::iterator node_of_interest = list2.begin(); + + list1.splice(list1.begin(), list2, node_of_interest); + list2.splice(list2.begin(), list1, node_of_interest); + + list1.merge(list2, std::less()); + + list2.splice(list2.begin(), list1, node_of_interest); + } +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/23_containers/list/operators/4.cc b/libstdc++-v3/testsuite/23_containers/list/operations/4.cc similarity index 100% rename from libstdc++-v3/testsuite/23_containers/list/operators/4.cc rename to libstdc++-v3/testsuite/23_containers/list/operations/4.cc diff --git a/libstdc++-v3/testsuite/23_containers/list/operators/5.cc b/libstdc++-v3/testsuite/23_containers/list/operations/5.cc similarity index 100% rename from libstdc++-v3/testsuite/23_containers/list/operators/5.cc rename to libstdc++-v3/testsuite/23_containers/list/operations/5.cc