From patchwork Mon Mar 5 01:21:49 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [v3] libstdc++/43813 Date: Sun, 04 Mar 2012 15:21:49 -0000 From: Paolo Carlini X-Patchwork-Id: 144554 Message-Id: <4F54152D.8060403@oracle.com> To: "gcc-patches@gcc.gnu.org" Cc: libstdc++ Hi, this is what I did to implement the resolution of lwg 1234. All in all pretty straightforward. Note I'm leaving alone for now basic_string and all the trickery with its exports (and well, I don't think *that* many people are instantiating basic_string for, eg, a pointer type). Tested x86_64-linux, normal and debug, committed. Thanks, Paolo. /////////////////////// 2012-03-04 Paolo Carlini Jonathan Wakely PR libstdc++/43813 * include/bits/stl_iterator_base_types.h (_RequireInputIter): New. * include/ext/vstring.h (__versa_string<>::__versa_string (_InputIterator, _InputIterator, const _Alloc&), __versa_string<>::append(_InputIterator, _InputIterator), __versa_string<>::assign(_InputIterator, _InputIterator), __versa_string<>::insert(iterator, _InputIterator, _InputIterator), __versa_string<>::replace(iterator, iterator, _InputIterator, _InputIterator)): Use it. * include/bits/stl_list.h (list<>::list(_InputIterator, _InputIterator, const allocator_type&), list<>::assign(_InputIterator, _InputIterator), list<>::insert(iterator, _InputIterator, _InputIterator)): Likewise. * include/bits/stl_vector.h (vector<>::vector(_InputIterator, _InputIterator, const allocator_type&), vector<>::assign(_InputIterator, _InputIterator), vectort<>::insert(iterator, _InputIterator, _InputIterator)): Likewise. * include/bits/stl_deque.h (deque<>::deque(_InputIterator, _InputIterator, const allocator_type&), deque<>::deque(_InputIterator, _InputIterator), deque<>::insert(iterator, _InputIterator, _InputIterator)): Likewise. * include/bits/stl_bvector.h (vector<>::vector(_InputIterator, _InputIterator, const allocator_type&), vector<>::deque(_InputIterator, _InputIterator), vector<>::insert(iterator, _InputIterator, _InputIterator)): Likewise. * include/bits/forward_list.h (forward_list<>::forward_list (_InputIterator, _InputIterator, const allocator_type&), forward_list<>::assign(_InputIterator, _InputIterator), forward_list<>::insert_after(const_iterator, _InputIterator, _InputIterator)): Likewise. (forward_list<>::_M_initialize_dispatch(,, __true_type): Remove. (forward_list<>::_M_range_initialize): Add, adjust everywhere. * include/bits/forward_list.tcc: Adjust. * include/debug/forward_list: Adjust. * include/debug/vector: Likewise. * include/debug/deque: Likewise. * include/debug/list: Likewise. * testsuite/ext/vstring/requirements/do_the_right_thing.cc: New. * testsuite/23_containers/forward_list/requirements/ do_the_right_thing.cc: Likewise. * testsuite/23_containers/vector/requirements/ do_the_right_thing.cc: Likewise. * testsuite/23_containers/deque/requirements/ do_the_right_thing.cc: Likewise. * testsuite/23_containers/list/requirements/ do_the_right_thing.cc: Likewise. * testsuite/23_containers/forward_list/requirements/dr438/ assign_neg.cc: Adjust dg-error line number. * testsuite/23_containers/forward_list/requirements/dr438/ insert_neg.cc: Likewise. * testsuite/23_containers/forward_list/requirements/dr438/ constructor_1_neg.cc: Likewise. * testsuite/23_containers/forward_list/requirements/dr438/ constructor_2_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/ assign_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/ insert_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/ constructor_1_neg.cc: Likewise. * testsuite/23_containers/vector/requirements/dr438/ constructor_2_neg.cc: Likewise. * testsuite/23_containers/deque/requirements/dr438/ assign_neg.cc: Likewise. * testsuite/23_containers/deque/requirements/dr438/ insert_neg.cc: Likewise. * testsuite/23_containers/deque/requirements/dr438/ constructor_1_neg.cc: Likewise. * testsuite/23_containers/deque/requirements/dr438/ constructor_2_neg.cc: Likewise. * testsuite/23_containers/list/requirements/dr438/ assign_neg.cc: Likewise. * testsuite/23_containers/list/requirements/dr438/ insert_neg.cc: Likewise. * testsuite/23_containers/list/requirements/dr438/ constructor_1_neg.cc: Likewise. * testsuite/23_containers/list/requirements/dr438/ constructor_2_neg.cc: Likewise. Index: include/debug/forward_list =================================================================== --- include/debug/forward_list (revision 184887) +++ include/debug/forward_list (working copy) @@ -1,6 +1,6 @@ // -*- C++ -*- -// Copyright (C) 2010 Free Software Foundation, Inc. +// Copyright (C) 2010, 2011, 2012 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 @@ -91,8 +91,9 @@ : _Base(__n, __value, __al) { } - template - forward_list(_InputIterator __first, _InputIterator __last, + template> + forward_list(_InputIterator __first, _InputIterator __last, const _Alloc& __al = _Alloc()) : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, __last)), @@ -143,8 +144,9 @@ return *this; } - template - void + template> + void assign(_InputIterator __first, _InputIterator __last) { __glibcxx_check_valid_range(__first, __last); @@ -273,7 +275,8 @@ this); } - template + template> iterator insert_after(const_iterator __pos, _InputIterator __first, _InputIterator __last) Index: include/debug/vector =================================================================== --- include/debug/vector (revision 184887) +++ include/debug/vector (working copy) @@ -1,6 +1,7 @@ // Debugging vector implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, +// 2012 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -95,7 +96,12 @@ : _Base(__n, __value, __a), _M_guaranteed_capacity(__n) { } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif vector(_InputIterator __first, _InputIterator __last, const _Allocator& __a = _Allocator()) : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, @@ -170,7 +176,12 @@ } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif void assign(_InputIterator __first, _InputIterator __last) { @@ -476,7 +487,12 @@ _M_update_guaranteed_capacity(); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif void insert(iterator __position, _InputIterator __first, _InputIterator __last) Index: include/debug/deque =================================================================== --- include/debug/deque (revision 184887) +++ include/debug/deque (working copy) @@ -1,6 +1,7 @@ // Debugging deque implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, +// 2012 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -88,7 +89,12 @@ : _Base(__n, __value, __a) { } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif deque(_InputIterator __first, _InputIterator __last, const _Allocator& __a = _Allocator()) : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, @@ -142,7 +148,12 @@ } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif void assign(_InputIterator __first, _InputIterator __last) { @@ -413,7 +424,12 @@ this->_M_invalidate_all(); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif void insert(iterator __position, _InputIterator __first, _InputIterator __last) Index: include/debug/list =================================================================== --- include/debug/list (revision 184887) +++ include/debug/list (working copy) @@ -1,6 +1,7 @@ // Debugging list implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, +// 2012 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -89,15 +90,19 @@ : _Base(__n, __value, __a) { } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template - list(_InputIterator __first, _InputIterator __last, - const _Allocator& __a = _Allocator()) - : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, - __last)), - __gnu_debug::__base(__last), __a) - { } +#endif + list(_InputIterator __first, _InputIterator __last, + const _Allocator& __a = _Allocator()) + : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, + __last)), + __gnu_debug::__base(__last), __a) + { } - list(const list& __x) : _Base(__x) { } @@ -151,7 +156,12 @@ } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif void assign(_InputIterator __first, _InputIterator __last) { @@ -405,7 +415,12 @@ _Base::insert(__position.base(), __n, __x); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif void insert(iterator __position, _InputIterator __first, _InputIterator __last) Index: include/ext/vstring.h =================================================================== --- include/ext/vstring.h (revision 184887) +++ include/ext/vstring.h (working copy) @@ -1,6 +1,6 @@ // Versatile string -*- C++ -*- -// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -238,7 +238,12 @@ * @param __end End of range. * @param __a Allocator to use (default is default allocator). */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif __versa_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a = _Alloc()) : __vstring_base(__beg, __end, __a) { } @@ -762,7 +767,12 @@ * * Appends characters in the range [first,last) to this string. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif __versa_string& append(_InputIterator __first, _InputIterator __last) { return this->replace(_M_iend(), _M_iend(), __first, __last); } @@ -886,7 +896,12 @@ * Sets value of string to characters in the range * [first,last). */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif __versa_string& assign(_InputIterator __first, _InputIterator __last) { return this->replace(_M_ibegin(), _M_iend(), __first, __last); } @@ -931,7 +946,12 @@ * thrown. The value of the string doesn't change if an error * is thrown. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif void insert(iterator __p, _InputIterator __beg, _InputIterator __end) { this->replace(__p, __p, __beg, __end); } @@ -1367,6 +1387,20 @@ * of result exceeds max_size(), length_error is thrown. The * value of the string doesn't change if an error is thrown. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + __versa_string& + replace(iterator __i1, iterator __i2, + _InputIterator __k1, _InputIterator __k2) + { + _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 + && __i2 <= _M_iend()); + __glibcxx_requires_valid_range(__k1, __k2); + return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, + std::__false_type()); + } +#else template __versa_string& replace(iterator __i1, iterator __i2, @@ -1378,6 +1412,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral()); } +#endif // Specializations for the common case of pointer and iterator: // useful to avoid the overhead of temporary buffering in _M_replace. Index: include/bits/stl_list.h =================================================================== --- include/bits/stl_list.h (revision 184887) +++ include/bits/stl_list.h (working copy) @@ -1,7 +1,7 @@ // List implementation -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -// 2011 Free Software Foundation, Inc. +// 2011, 2012 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 @@ -638,6 +638,14 @@ * [@a __first,@a __last). This is linear in N (where N is * distance(@a __first,@a __last)). */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + list(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Base(_Node_alloc_type(__a)) + { _M_initialize_dispatch(__first, __last, __false_type()); } +#else template list(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type()) @@ -647,6 +655,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_initialize_dispatch(__first, __last, _Integral()); } +#endif /** * No explicit dtor needed as the _Base dtor takes care of @@ -725,6 +734,13 @@ * that the resulting %list's size is the same as the number of * elements assigned. Old data may be lost. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + void + assign(_InputIterator __first, _InputIterator __last) + { _M_assign_dispatch(__first, __last, __false_type()); } +#else template void assign(_InputIterator __first, _InputIterator __last) @@ -733,6 +749,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_assign_dispatch(__first, __last, _Integral()); } +#endif #ifdef __GXX_EXPERIMENTAL_CXX0X__ /** @@ -1148,7 +1165,12 @@ * This operation is linear in the number of elements inserted and * does not invalidate iterators and references. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> +#else template +#endif void insert(iterator __position, _InputIterator __first, _InputIterator __last) Index: include/bits/stl_iterator_base_types.h =================================================================== --- include/bits/stl_iterator_base_types.h (revision 184887) +++ include/bits/stl_iterator_base_types.h (working copy) @@ -1,6 +1,7 @@ // Types used in iterator implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +// 2010, 2011, 2012 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -65,7 +66,7 @@ #include #ifdef __GXX_EXPERIMENTAL_CXX0X__ -# include // For _GLIBCXX_HAS_NESTED_TYPE +# include // For _GLIBCXX_HAS_NESTED_TYPE, is_convertible #endif namespace std _GLIBCXX_VISIBILITY(default) @@ -222,6 +223,14 @@ { return __it.base(); } }; +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template + using _RequireInputIter = typename + enable_if::iterator_category, + input_iterator_tag>::value>::type; +#endif + _GLIBCXX_END_NAMESPACE_VERSION } // namespace Index: include/bits/forward_list.h =================================================================== --- include/bits/forward_list.h (revision 184887) +++ include/bits/forward_list.h (working copy) @@ -1,6 +1,6 @@ // -*- C++ -*- -// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright (C) 2008, 2009, 2010, 2011, 2012 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 @@ -499,15 +499,12 @@ * [@a __first,@a __last). This is linear in N (where N is * distance(@a __first,@a __last)). */ - template + template> forward_list(_InputIterator __first, _InputIterator __last, const _Alloc& __al = _Alloc()) : _Base(_Node_alloc_type(__al)) - { - // Check whether it's an integral type. If so, it's not an iterator. - typedef typename std::__is_integer<_InputIterator>::__type _Integral; - _M_initialize_dispatch(__first, __last, _Integral()); - } + { _M_range_initialize(__first, __last); } /** * @brief The %forward_list copy constructor. @@ -519,7 +516,7 @@ */ forward_list(const forward_list& __list) : _Base(__list._M_get_Node_allocator()) - { _M_initialize_dispatch(__list.begin(), __list.end(), __false_type()); } + { _M_range_initialize(__list.begin(), __list.end()); } /** * @brief The %forward_list move constructor. @@ -544,7 +541,7 @@ forward_list(std::initializer_list<_Tp> __il, const _Alloc& __al = _Alloc()) : _Base(_Node_alloc_type(__al)) - { _M_initialize_dispatch(__il.begin(), __il.end(), __false_type()); } + { _M_range_initialize(__il.begin(), __il.end()); } /** * @brief The forward_list dtor. @@ -609,8 +606,9 @@ * that the resulting %forward_list's size is the same as the number * of elements assigned. Old data may be lost. */ - template - void + template> + void assign(_InputIterator __first, _InputIterator __last) { clear(); @@ -905,7 +903,8 @@ * This operation is linear in the number of elements inserted and * does not invalidate iterators and references. */ - template + template> iterator insert_after(const_iterator __pos, _InputIterator __first, _InputIterator __last); @@ -1207,16 +1206,10 @@ { this->_M_impl._M_head._M_reverse_after(); } private: - template - void - _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) - { _M_fill_initialize(static_cast(__n), __x); } - // Called by the range constructor to implement [23.1.1]/9 template void - _M_initialize_dispatch(_InputIterator __first, _InputIterator __last, - __false_type); + _M_range_initialize(_InputIterator __first, _InputIterator __last); // Called by forward_list(n,v,a), and the range constructor when it // turns out to be the same thing. Index: include/bits/stl_vector.h =================================================================== --- include/bits/stl_vector.h (revision 184887) +++ include/bits/stl_vector.h (working copy) @@ -1,7 +1,7 @@ // Vector implementation -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -// 2011 Free Software Foundation, Inc. +// 2011, 2012 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 @@ -383,6 +383,14 @@ * used, then this will do at most 2N calls to the copy * constructor, and logN memory reallocations. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + vector(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { _M_initialize_dispatch(__first, __last, __false_type()); } +#else template vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type()) @@ -392,6 +400,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_initialize_dispatch(__first, __last, _Integral()); } +#endif /** * The dtor only erases the elements, and note that if the @@ -497,6 +506,13 @@ * that the resulting %vector's size is the same as the number * of elements assigned. Old data may be lost. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + void + assign(_InputIterator __first, _InputIterator __last) + { _M_assign_dispatch(__first, __last, __false_type()); } +#else template void assign(_InputIterator __first, _InputIterator __last) @@ -505,6 +521,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_assign_dispatch(__first, __last, _Integral()); } +#endif #ifdef __GXX_EXPERIMENTAL_CXX0X__ /** @@ -1035,6 +1052,14 @@ * %vector and if it is frequently used the user should * consider using std::list. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + void + insert(iterator __position, _InputIterator __first, + _InputIterator __last) + { _M_insert_dispatch(__position, __first, __last, __false_type()); } +#else template void insert(iterator __position, _InputIterator __first, @@ -1044,6 +1069,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_insert_dispatch(__position, __first, __last, _Integral()); } +#endif /** * @brief Remove element at given position. Index: include/bits/stl_deque.h =================================================================== --- include/bits/stl_deque.h (revision 184887) +++ include/bits/stl_deque.h (working copy) @@ -1,7 +1,7 @@ // Deque implementation -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -// 2011 Free Software Foundation, Inc. +// 2011, 2012 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 @@ -888,6 +888,14 @@ * input iterators are used, then this will do at most 2N calls to the * copy constructor, and logN memory reallocations. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + deque(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { _M_initialize_dispatch(__first, __last, __false_type()); } +#else template deque(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type()) @@ -897,6 +905,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_initialize_dispatch(__first, __last, _Integral()); } +#endif /** * The dtor only erases the elements, and note that if the elements @@ -979,6 +988,13 @@ * resulting %deque's size is the same as the number of elements * assigned. Old data may be lost. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + void + assign(_InputIterator __first, _InputIterator __last) + { _M_assign_dispatch(__first, __last, __false_type()); } +#else template void assign(_InputIterator __first, _InputIterator __last) @@ -986,6 +1002,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_assign_dispatch(__first, __last, _Integral()); } +#endif #ifdef __GXX_EXPERIMENTAL_CXX0X__ /** @@ -1510,6 +1527,14 @@ * [__first,__last) into the %deque before the location specified * by @a __position. This is known as range insert. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + void + insert(iterator __position, _InputIterator __first, + _InputIterator __last) + { _M_insert_dispatch(__position, __first, __last, __false_type()); } +#else template void insert(iterator __position, _InputIterator __first, @@ -1519,6 +1544,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_insert_dispatch(__position, __first, __last, _Integral()); } +#endif /** * @brief Remove element at given position. Index: include/bits/forward_list.tcc =================================================================== --- include/bits/forward_list.tcc (revision 184887) +++ include/bits/forward_list.tcc (working copy) @@ -1,6 +1,6 @@ // -*- C++ -*- -// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright (C) 2008, 2009, 2010, 2011, 2012 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 @@ -100,8 +100,7 @@ template void forward_list<_Tp, _Alloc>:: - _M_initialize_dispatch(_InputIterator __first, _InputIterator __last, - __false_type) + _M_range_initialize(_InputIterator __first, _InputIterator __last) { _Node_base* __to = &this->_M_impl._M_head; for (; __first != __last; ++__first) @@ -111,8 +110,7 @@ } } - // Called by forward_list(n,v,a), and the range constructor - // when it turns out to be the same thing. + // Called by forward_list(n,v,a). template void forward_list<_Tp, _Alloc>:: @@ -258,7 +256,7 @@ } template - template + template typename forward_list<_Tp, _Alloc>::iterator forward_list<_Tp, _Alloc>:: insert_after(const_iterator __pos, Index: include/bits/stl_bvector.h =================================================================== --- include/bits/stl_bvector.h (revision 184887) +++ include/bits/stl_bvector.h (working copy) @@ -1,7 +1,7 @@ // vector specialization -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -// 2011 Free Software Foundation, Inc. +// 2011, 2012 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 @@ -557,6 +557,14 @@ } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + vector(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { _M_initialize_dispatch(__first, __last, __false_type()); } +#else template vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type()) @@ -565,6 +573,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_initialize_dispatch(__first, __last, _Integral()); } +#endif ~vector() _GLIBCXX_NOEXCEPT { } @@ -610,6 +619,13 @@ assign(size_type __n, const bool& __x) { _M_fill_assign(__n, __x); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + void + assign(_InputIterator __first, _InputIterator __last) + { _M_assign_dispatch(__first, __last, __false_type()); } +#else template void assign(_InputIterator __first, _InputIterator __last) @@ -617,6 +633,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_assign_dispatch(__first, __last, _Integral()); } +#endif #ifdef __GXX_EXPERIMENTAL_CXX0X__ void @@ -806,6 +823,14 @@ return begin() + __n; } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template> + void + insert(iterator __position, + _InputIterator __first, _InputIterator __last) + { _M_insert_dispatch(__position, __first, __last, __false_type()); } +#else template void insert(iterator __position, @@ -814,6 +839,7 @@ typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_insert_dispatch(__position, __first, __last, _Integral()); } +#endif void insert(iterator __position, size_type __n, const bool& __x) Index: testsuite/ext/vstring/requirements/do_the_right_thing.cc =================================================================== --- testsuite/ext/vstring/requirements/do_the_right_thing.cc (revision 0) +++ testsuite/ext/vstring/requirements/do_the_right_thing.cc (revision 0) @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2012 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 Pred 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 +// . + +#include + +// libstdc++/43813 +void test01() +{ + __gnu_cxx::__versa_string vs(7, 0); + vs.assign(7, 0); + vs.append(7, 0); + vs.insert(vs.begin(), 7, 0); + vs.replace(vs.begin(), vs.end(), 7, 0); +} Index: testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc =================================================================== --- testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc (revision 184887) +++ testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc (working copy) @@ -1,8 +1,8 @@ // { dg-do compile } // { dg-options "-std=gnu++0x" } -// { dg-error "no matching" "" { target *-*-* } 1213 } +// { dg-error "no matching" "" { target *-*-* } 33 } -// Copyright (C) 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation // // 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 Index: testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc =================================================================== --- testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc (revision 184887) +++ testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc (working copy) @@ -1,8 +1,8 @@ // { dg-do compile } // { dg-options "-std=gnu++0x" } -// { dg-error "no matching" "" { target *-*-* } 1213 } +// { dg-error "no matching" "" { target *-*-* } 33 } -// Copyright (C) 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation // // 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 Index: testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc =================================================================== --- testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc (revision 184887) +++ testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc (working copy) @@ -1,8 +1,8 @@ // { dg-do compile } // { dg-options "-std=gnu++0x" } -// { dg-error "no matching" "" { target *-*-* } 1213 } +// { dg-error "no matching" "" { target *-*-* } 27 } -// Copyright (C) 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation // // 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 Index: testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc =================================================================== --- testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc (revision 184887) +++ testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc (working copy) @@ -1,8 +1,8 @@ // { dg-do compile } // { dg-options "-std=gnu++0x" } -// { dg-error "no matching" "" { target *-*-* } 1213 } +// { dg-error "no matching" "" { target *-*-* } 28 } -// Copyright (C) 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation // // 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 Index: testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc =================================================================== --- testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc (revision 0) +++ testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc (revision 0) @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2012 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 Pred 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 +// . + +#include + +// libstdc++/43813 +void test01() +{ + std::forward_list fl(7, 0); + fl.assign(7, 0); + fl.insert_after(fl.before_begin(), 7, 0); +} Index: testsuite/23_containers/vector/requirements/dr438/assign_neg.cc =================================================================== --- testsuite/23_containers/vector/requirements/dr438/assign_neg.cc (revision 184887) +++ testsuite/23_containers/vector/requirements/dr438/assign_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1225 } +// { dg-error "no matching" "" { target *-*-* } 1251 } #include Index: testsuite/23_containers/vector/requirements/dr438/insert_neg.cc =================================================================== --- testsuite/23_containers/vector/requirements/dr438/insert_neg.cc (revision 184887) +++ testsuite/23_containers/vector/requirements/dr438/insert_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1266 } +// { dg-error "no matching" "" { target *-*-* } 1292 } #include Index: testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc =================================================================== --- testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc (revision 184887) +++ testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1155 } +// { dg-error "no matching" "" { target *-*-* } 1181 } #include Index: testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc =================================================================== --- testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc (revision 184887) +++ testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1155 } +// { dg-error "no matching" "" { target *-*-* } 1181 } #include #include Index: testsuite/23_containers/vector/requirements/do_the_right_thing.cc =================================================================== --- testsuite/23_containers/vector/requirements/do_the_right_thing.cc (revision 0) +++ testsuite/23_containers/vector/requirements/do_the_right_thing.cc (revision 0) @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2012 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 Pred 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 +// . + +#include + +// libstdc++/43813 +void test01() +{ + std::vector v(7, 0); + v.assign(7, 0); + v.insert(v.begin(), 7, 0); +} Index: testsuite/23_containers/deque/requirements/dr438/assign_neg.cc =================================================================== --- testsuite/23_containers/deque/requirements/dr438/assign_neg.cc (revision 184887) +++ testsuite/23_containers/deque/requirements/dr438/assign_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1670 } +// { dg-error "no matching" "" { target *-*-* } 1696 } #include Index: testsuite/23_containers/deque/requirements/dr438/insert_neg.cc =================================================================== --- testsuite/23_containers/deque/requirements/dr438/insert_neg.cc (revision 184887) +++ testsuite/23_containers/deque/requirements/dr438/insert_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1754 } +// { dg-error "no matching" "" { target *-*-* } 1780 } #include Index: testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc =================================================================== --- testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc (revision 184887) +++ testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1603 } +// { dg-error "no matching" "" { target *-*-* } 1629 } #include Index: testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc =================================================================== --- testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc (revision 184887) +++ testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1603 } +// { dg-error "no matching" "" { target *-*-* } 1629 } #include #include Index: testsuite/23_containers/deque/requirements/do_the_right_thing.cc =================================================================== --- testsuite/23_containers/deque/requirements/do_the_right_thing.cc (revision 0) +++ testsuite/23_containers/deque/requirements/do_the_right_thing.cc (revision 0) @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-std=gnu++11" } + +// Copyright (C) 2012 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 Pred 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 +// . + +#include + +// libstdc++/43813 +void test01() +{ + std::deque d(7, 0); + d.assign(7, 0); + d.insert(d.begin(), 7, 0); +} Index: testsuite/23_containers/list/requirements/dr438/assign_neg.cc =================================================================== --- testsuite/23_containers/list/requirements/dr438/assign_neg.cc (revision 184887) +++ testsuite/23_containers/list/requirements/dr438/assign_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1552 } +// { dg-error "no matching" "" { target *-*-* } 1574 } #include Index: testsuite/23_containers/list/requirements/dr438/insert_neg.cc =================================================================== --- testsuite/23_containers/list/requirements/dr438/insert_neg.cc (revision 184887) +++ testsuite/23_containers/list/requirements/dr438/insert_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1508 } +// { dg-error "no matching" "" { target *-*-* } 1530 } #include Index: testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc =================================================================== --- testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc (revision 184887) +++ testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1508 } +// { dg-error "no matching" "" { target *-*-* } 1530 } #include Index: testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc =================================================================== --- testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc (revision 184887) +++ testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc (working copy) @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation +// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation // // 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 @@ -18,7 +18,7 @@ // . // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1508 } +// { dg-error "no matching" "" { target *-*-* } 1530 } #include #include Index: testsuite/23_containers/list/requirements/do_the_right_thing.cc =================================================================== --- testsuite/23_containers/list/requirements/do_the_right_thing.cc (revision 0) +++ testsuite/23_containers/list/requirements/do_the_right_thing.cc (revision 0) @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2012 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 Pred 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 +// . + +#include + +// libstdc++/43813 +void test01() +{ + std::list l(7, 0); + l.assign(7, 0); + l.insert(l.begin(), 7, 0); +}