From: Paolo Carlini Date: Sun, 3 Jan 2010 20:30:28 +0000 (+0000) Subject: set.h: Implement DR 130 here too. X-Git-Tag: releases/gcc-4.5.0~1426 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ab06c6dfee6999f0ebd2d77f53766de18e5dc5f;p=thirdparty%2Fgcc.git set.h: Implement DR 130 here too. 2010-01-03 Paolo Carlini * include/debug/set.h: Implement DR 130 here too. * include/debug/multiset.h: Likewise. * include/debug/map.h: Likewise. * include/debug/multimap.h: Likewise. * include/profile/set.h: Implement DR 130 fully. * include/profile/multiset.h: Likewise. * include/profile/map.h: Likewise. * include/profile/multimap.h: Likewise. * include/debug/list: Implement DR 1133 here too. * include/ext/pb_ds/detail/debug_map_base.hpp: Comment out for now uses of __gnu_cxx::throw_allocator. * testsuite/21_strings/basic_string/40160.cc: Don't pass explicitly -D_GLIBCXX_DEBUG, doesn't play well with profile-mode testing. From-SVN: r155594 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f77a30123cee..91865590a4c8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,20 @@ +2010-01-03 Paolo Carlini + + * include/debug/set.h: Implement DR 130 here too. + * include/debug/multiset.h: Likewise. + * include/debug/map.h: Likewise. + * include/debug/multimap.h: Likewise. + * include/profile/set.h: Implement DR 130 fully. + * include/profile/multiset.h: Likewise. + * include/profile/map.h: Likewise. + * include/profile/multimap.h: Likewise. + * include/debug/list: Implement DR 1133 here too. + * include/ext/pb_ds/detail/debug_map_base.hpp: Comment out for + now uses of __gnu_cxx::throw_allocator. + * testsuite/21_strings/basic_string/40160.cc: Don't pass + explicitly -D_GLIBCXX_DEBUG, doesn't play well with profile-mode + testing. + 2010-01-03 Paolo Carlini * include/profile/bitset (bitset<>::bitset(unsigned long long)): Add diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index 72060e0dc9cf..3af008c6b172 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, 2008, 2009 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -395,6 +395,12 @@ namespace __debug this->splice(__position, _GLIBCXX_MOVE(__x), __x.begin(), __x.end()); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + void + splice(iterator __position, list& __x) + { splice(__position, std::move(__x)); } +#endif + void #ifdef __GXX_EXPERIMENTAL_CXX0X__ splice(iterator __position, list&& __x, iterator __i) @@ -421,6 +427,12 @@ namespace __debug __i.base()); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + void + splice(iterator __position, list& __x, iterator __i) + { splice(__position, std::move(__x), __i); } +#endif + void #ifdef __GXX_EXPERIMENTAL_CXX0X__ splice(iterator __position, list&& __x, iterator __first, @@ -457,6 +469,12 @@ namespace __debug __first.base(), __last.base()); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + void + splice(iterator __position, list& __x, iterator __first, iterator __last) + { splice(__position, std::move(__x), __first, __last); } +#endif + void remove(const _Tp& __value) { @@ -541,6 +559,12 @@ namespace __debug } } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + void + merge(list& __x) + { merge(std::move(__x)); } +#endif + template void #ifdef __GXX_EXPERIMENTAL_CXX0X__ @@ -566,6 +590,13 @@ namespace __debug } } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template + void + merge(list& __x, _Compare __comp) + { merge(std::move(__x), __comp); } +#endif + void sort() { _Base::sort(); } diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index 2ac21dff5bc8..9a558b594887 100644 --- a/libstdc++-v3/include/debug/map.h +++ b/libstdc++-v3/include/debug/map.h @@ -1,6 +1,6 @@ // Debugging map implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -228,6 +228,15 @@ namespace __debug _Base::insert(__first, __last); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __position) + { + __glibcxx_check_erase(__position); + __position._M_invalidate(); + return iterator(_Base::erase(__position.base()), this); + } +#else void erase(iterator __position) { @@ -235,6 +244,7 @@ namespace __debug __position._M_invalidate(); _Base::erase(__position.base()); } +#endif size_type erase(const key_type& __x) @@ -250,6 +260,18 @@ namespace __debug } } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __first, iterator __last) + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 151. can't currently clear() empty container + __glibcxx_check_erase_range(__first, __last); + while (__first != __last) + this->erase(__first++); + return __last; + } +#else void erase(iterator __first, iterator __last) { @@ -259,6 +281,7 @@ namespace __debug while (__first != __last) this->erase(__first++); } +#endif void swap(map& __x) diff --git a/libstdc++-v3/include/debug/multimap.h b/libstdc++-v3/include/debug/multimap.h index 3c525b5fac6a..f69a289cf65d 100644 --- a/libstdc++-v3/include/debug/multimap.h +++ b/libstdc++-v3/include/debug/multimap.h @@ -1,6 +1,6 @@ // Debugging multimap implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -215,6 +215,15 @@ namespace __debug _Base::insert(__first, __last); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __position) + { + __glibcxx_check_erase(__position); + __position._M_invalidate(); + return iterator(_Base::erase(__position.base()), this); + } +#else void erase(iterator __position) { @@ -222,6 +231,7 @@ namespace __debug __position._M_invalidate(); _Base::erase(__position.base()); } +#endif size_type erase(const key_type& __x) @@ -238,6 +248,18 @@ namespace __debug return __count; } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __first, iterator __last) + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 151. can't currently clear() empty container + __glibcxx_check_erase_range(__first, __last); + while (__first != __last) + this->erase(__first++); + return __last; + } +#else void erase(iterator __first, iterator __last) { @@ -245,8 +267,9 @@ namespace __debug // 151. can't currently clear() empty container __glibcxx_check_erase_range(__first, __last); while (__first != __last) - this->erase(__first++); + this->erase(__first++); } +#endif void swap(multimap& __x) diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h index 1a15c207bc89..91909826d7a7 100644 --- a/libstdc++-v3/include/debug/multiset.h +++ b/libstdc++-v3/include/debug/multiset.h @@ -1,6 +1,6 @@ // Debugging multiset implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -212,6 +212,15 @@ namespace __debug { _Base::insert(__l); } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __position) + { + __glibcxx_check_erase(__position); + __position._M_invalidate(); + return iterator(_Base::erase(__position.base()), this); + } +#else void erase(iterator __position) { @@ -219,6 +228,7 @@ namespace __debug __position._M_invalidate(); _Base::erase(__position.base()); } +#endif size_type erase(const key_type& __x) @@ -235,6 +245,18 @@ namespace __debug return __count; } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __first, iterator __last) + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 151. can't currently clear() empty container + __glibcxx_check_erase_range(__first, __last); + while (__first != __last) + this->erase(__first++); + return __last; + } +#else void erase(iterator __first, iterator __last) { @@ -242,8 +264,9 @@ namespace __debug // 151. can't currently clear() empty container __glibcxx_check_erase_range(__first, __last); while (__first != __last) - this->erase(__first++); + this->erase(__first++); } +#endif void swap(multiset& __x) diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index b822ba9606ef..769639d721bf 100644 --- a/libstdc++-v3/include/debug/set.h +++ b/libstdc++-v3/include/debug/set.h @@ -1,6 +1,6 @@ // Debugging set implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -217,6 +217,15 @@ namespace __debug { _Base::insert(__l); } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __position) + { + __glibcxx_check_erase(__position); + __position._M_invalidate(); + return iterator(_Base::erase(__position.base()), this); + } +#else void erase(iterator __position) { @@ -224,6 +233,7 @@ namespace __debug __position._M_invalidate(); _Base::erase(__position.base()); } +#endif size_type erase(const key_type& __x) @@ -239,16 +249,28 @@ namespace __debug } } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __first, iterator __last) + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 151. can't currently clear() empty container + __glibcxx_check_erase_range(__first, __last); + while (__first != __last) + this->erase(__first++); + return __last; + } +#else void erase(iterator __first, iterator __last) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container __glibcxx_check_erase_range(__first, __last); - while (__first != __last) - this->erase(__first++); + this->erase(__first++); } +#endif void swap(set& __x) diff --git a/libstdc++-v3/include/ext/pb_ds/detail/debug_map_base.hpp b/libstdc++-v3/include/ext/pb_ds/detail/debug_map_base.hpp index 2227691feb0e..ebe8dc8416f7 100644 --- a/libstdc++-v3/include/ext/pb_ds/detail/debug_map_base.hpp +++ b/libstdc++-v3/include/ext/pb_ds/detail/debug_map_base.hpp @@ -1,6 +1,7 @@ // -*- C++ -*- -// Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 +// 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 @@ -153,9 +154,10 @@ namespace __gnu_pbds insert_new(const_key_reference r_key) { _GLIBCXX_DEBUG_ONLY(assert_valid();) - __gnu_cxx::throw_allocator alloc; - const double orig_throw_prob = alloc.get_probability(); - alloc.set_probability(0); + // XXX FIXME: Adapt for __gnu_cxx::throw_allocator_random. + //__gnu_cxx::throw_allocator alloc; + // const double orig_throw_prob = alloc.get_probability(); + // alloc.set_probability(0); if (find(r_key) != m_key_set.end()) { std::cerr << "insert_new" << r_key << std::endl; @@ -171,7 +173,7 @@ namespace __gnu_pbds std::cerr << "insert_new" << r_key << std::endl; std::abort(); } - alloc.set_probability(orig_throw_prob); + // alloc.set_probability(orig_throw_prob); _GLIBCXX_DEBUG_ONLY(assert_valid();) } @@ -314,9 +316,10 @@ namespace __gnu_pbds PB_DS_CLASS_C_DEC:: split(const_key_reference r_key, Cmp_Fn cmp_fn, PB_DS_CLASS_C_DEC& other) { - __gnu_cxx::throw_allocator alloc; - const double orig_throw_prob = alloc.get_probability(); - alloc.set_probability(0); + // XXX FIXME: Adapt for __gnu_cxx::throw_allocator_random. + // __gnu_cxx::throw_allocator alloc; + // const double orig_throw_prob = alloc.get_probability(); + // alloc.set_probability(0); other.clear(); key_set_iterator it = m_key_set.begin(); while (it != m_key_set.end()) @@ -327,7 +330,7 @@ namespace __gnu_pbds } else ++it; - alloc.set_probability(orig_throw_prob); + // alloc.set_probability(orig_throw_prob); } PB_DS_CLASS_T_DEC @@ -335,9 +338,10 @@ namespace __gnu_pbds PB_DS_CLASS_C_DEC:: join(PB_DS_CLASS_C_DEC& other) { - __gnu_cxx::throw_allocator alloc; - const double orig_throw_prob = alloc.get_probability(); - alloc.set_probability(0); + // XXX FIXME: Adapt for __gnu_cxx::throw_allocator_random. + // __gnu_cxx::throw_allocator alloc; + // const double orig_throw_prob = alloc.get_probability(); + // alloc.set_probability(0); key_set_iterator it = other.m_key_set.begin(); while (it != other.m_key_set.end()) { @@ -345,7 +349,7 @@ namespace __gnu_pbds it = other.m_key_set.erase(it); } _GLIBCXX_DEBUG_ASSERT(other.m_key_set.empty()); - alloc.set_probability(orig_throw_prob); + // alloc.set_probability(orig_throw_prob); } #undef PB_DS_CLASS_T_DEC diff --git a/libstdc++-v3/include/profile/map.h b/libstdc++-v3/include/profile/map.h index 0197d458f5eb..baa877db5fe1 100644 --- a/libstdc++-v3/include/profile/map.h +++ b/libstdc++-v3/include/profile/map.h @@ -1,6 +1,6 @@ // Profiling map implementation -*- C++ -*- -// Copyright (C) 2009 Free Software Foundation, Inc. +// Copyright (C) 2009, 2010 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 @@ -307,6 +307,17 @@ namespace __profile } } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __first, iterator __last) + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 151. can't currently clear() empty container + while (__first != __last) + this->erase(__first++); + return __last; + } +#else void erase(iterator __first, iterator __last) { @@ -315,6 +326,7 @@ namespace __profile while (__first != __last) this->erase(__first++); } +#endif void diff --git a/libstdc++-v3/include/profile/multimap.h b/libstdc++-v3/include/profile/multimap.h index 9a65a937f347..df4e02d93d37 100644 --- a/libstdc++-v3/include/profile/multimap.h +++ b/libstdc++-v3/include/profile/multimap.h @@ -206,15 +206,11 @@ namespace __profile #ifdef __GXX_EXPERIMENTAL_CXX0X__ iterator erase(iterator __position) - { - return _Base::erase(__position); - } + { return _Base::erase(__position); } #else void erase(iterator __position) - { - _Base::erase(__position); - } + { _Base::erase(__position); } #endif size_type @@ -231,14 +227,26 @@ namespace __profile return __count; } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __first, iterator __last) + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 151. can't currently clear() empty container + while (__first != __last) + this->erase(__first++); + return __last; + } +#else void erase(iterator __first, iterator __last) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container while (__first != __last) - this->erase(__first++); + this->erase(__first++); } +#endif void swap(multimap& __x) diff --git a/libstdc++-v3/include/profile/multiset.h b/libstdc++-v3/include/profile/multiset.h index 69a11f47574d..b44abc40aef8 100644 --- a/libstdc++-v3/include/profile/multiset.h +++ b/libstdc++-v3/include/profile/multiset.h @@ -1,6 +1,6 @@ // Profiling multiset implementation -*- C++ -*- -// Copyright (C) 2009 Free Software Foundation, Inc. +// Copyright (C) 2009, 2010 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 @@ -204,15 +204,11 @@ namespace __profile #ifdef __GXX_EXPERIMENTAL_CXX0X__ iterator erase(iterator __position) - { - return _Base::erase(__position); - } + { return _Base::erase(__position); } #else void erase(iterator __position) - { - _Base::erase(__position); - } + { _Base::erase(__position); } #endif size_type @@ -229,14 +225,26 @@ namespace __profile return __count; } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __first, iterator __last) + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 151. can't currently clear() empty container + while (__first != __last) + this->erase(__first++); + return __last; + } +#else void erase(iterator __first, iterator __last) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container while (__first != __last) - this->erase(__first++); + this->erase(__first++); } +#endif void swap(multiset& __x) diff --git a/libstdc++-v3/include/profile/set.h b/libstdc++-v3/include/profile/set.h index af249a261c51..6c6773c134e7 100644 --- a/libstdc++-v3/include/profile/set.h +++ b/libstdc++-v3/include/profile/set.h @@ -1,6 +1,6 @@ // Profiling set implementation -*- C++ -*- -// Copyright (C) 2009 Free Software Foundation, Inc. +// Copyright (C) 2009, 2010 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 @@ -209,15 +209,11 @@ namespace __profile #ifdef __GXX_EXPERIMENTAL_CXX0X__ iterator erase(iterator __position) - { - return _Base::erase(__position); - } + { return _Base::erase(__position); } #else void erase(iterator __position) - { - _Base::erase(__position); - } + { _Base::erase(__position); } #endif size_type @@ -233,14 +229,26 @@ namespace __profile } } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + iterator + erase(iterator __first, iterator __last) + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 151. can't currently clear() empty container + while (__first != __last) + this->erase(__first++); + return __last; + } +#else void erase(iterator __first, iterator __last) { // _GLIBCXX_RESOLVE_LIB_DEFECTS // 151. can't currently clear() empty container while (__first != __last) - this->erase(__first++); + this->erase(__first++); } +#endif void swap(set& __x) diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/40160.cc b/libstdc++-v3/testsuite/21_strings/basic_string/40160.cc index 5472a753e6bb..5a746f13dbc8 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/40160.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/40160.cc @@ -1,6 +1,6 @@ // -*- C++ -*- -// Copyright (C) 2009 Free Software Foundation, Inc. +// Copyright (C) 2009, 2010 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 @@ -17,7 +17,7 @@ // with this library; see the file COPYING3. If not see // . -// { dg-options "-fno-rtti -D_GLIBCXX_DEBUG" } +// { dg-options "-fno-rtti" } // { dg-do compile } // libstdc++/40160