From 27995ee1b8257f1ad72929bdbfff8ebf06d052f9 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 24 Apr 2008 17:03:13 +0000 Subject: [PATCH] re PR libstdc++/35969 (GLIBCXX_DEBUG: list::merge triggers bad assert) 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. From-SVN: r134642 --- libstdc++-v3/ChangeLog | 10 +++ libstdc++-v3/include/debug/list | 39 +++++---- .../list/{operators => operations}/1.cc | 0 .../list/{operators => operations}/2.cc | 0 .../list/{operators => operations}/3.cc | 0 .../23_containers/list/operations/35969.cc | 80 +++++++++++++++++++ .../list/{operators => operations}/4.cc | 0 .../list/{operators => operations}/5.cc | 0 8 files changed, 115 insertions(+), 14 deletions(-) rename libstdc++-v3/testsuite/23_containers/list/{operators => operations}/1.cc (100%) rename libstdc++-v3/testsuite/23_containers/list/{operators => operations}/2.cc (100%) rename libstdc++-v3/testsuite/23_containers/list/{operators => operations}/3.cc (100%) create mode 100644 libstdc++-v3/testsuite/23_containers/list/operations/35969.cc rename libstdc++-v3/testsuite/23_containers/list/{operators => operations}/4.cc (100%) rename libstdc++-v3/testsuite/23_containers/list/{operators => operations}/5.cc (100%) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cdf96562862..8b16606df6a 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 b071d4fcdd6..d0797e9bf46 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 00000000000..97747ad9a6e --- /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 -- 2.30.2