From 2203cb90fb793e384645e390e3a4112c47a7cb1d Mon Sep 17 00:00:00 2001 From: Paolo Carlini <paolo.carlini@oracle.com> Date: Mon, 5 Mar 2012 01:15:28 +0000 Subject: [PATCH] re PR libstdc++/43813 ([DR1234] vector<T*>(3, NULL) fails to compile) 2012-03-04 Paolo Carlini <paolo.carlini@oracle.com> Jonathan Wakely <jwakely.gcc@gmail.com> 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. Co-Authored-By: Jonathan Wakely <jwakely.gcc@gmail.com> From-SVN: r184911 --- libstdc++-v3/ChangeLog | 82 +++++++++++++++++++ libstdc++-v3/include/bits/forward_list.h | 31 +++---- libstdc++-v3/include/bits/forward_list.tcc | 10 +-- libstdc++-v3/include/bits/stl_bvector.h | 28 ++++++- libstdc++-v3/include/bits/stl_deque.h | 28 ++++++- .../include/bits/stl_iterator_base_types.h | 13 ++- libstdc++-v3/include/bits/stl_list.h | 24 +++++- libstdc++-v3/include/bits/stl_vector.h | 28 ++++++- libstdc++-v3/include/debug/deque | 18 +++- libstdc++-v3/include/debug/forward_list | 15 ++-- libstdc++-v3/include/debug/list | 31 +++++-- libstdc++-v3/include/debug/vector | 18 +++- libstdc++-v3/include/ext/vstring.h | 37 ++++++++- .../deque/requirements/do_the_right_thing.cc | 29 +++++++ .../deque/requirements/dr438/assign_neg.cc | 4 +- .../requirements/dr438/constructor_1_neg.cc | 4 +- .../requirements/dr438/constructor_2_neg.cc | 4 +- .../deque/requirements/dr438/insert_neg.cc | 4 +- .../requirements/do_the_right_thing.cc | 29 +++++++ .../requirements/dr438/assign_neg.cc | 4 +- .../requirements/dr438/constructor_1_neg.cc | 4 +- .../requirements/dr438/constructor_2_neg.cc | 4 +- .../requirements/dr438/insert_neg.cc | 4 +- .../list/requirements/do_the_right_thing.cc | 29 +++++++ .../list/requirements/dr438/assign_neg.cc | 4 +- .../requirements/dr438/constructor_1_neg.cc | 4 +- .../requirements/dr438/constructor_2_neg.cc | 4 +- .../list/requirements/dr438/insert_neg.cc | 4 +- .../vector/requirements/do_the_right_thing.cc | 29 +++++++ .../vector/requirements/dr438/assign_neg.cc | 4 +- .../requirements/dr438/constructor_1_neg.cc | 4 +- .../requirements/dr438/constructor_2_neg.cc | 4 +- .../vector/requirements/dr438/insert_neg.cc | 4 +- .../requirements/do_the_right_thing.cc | 31 +++++++ 34 files changed, 494 insertions(+), 80 deletions(-) create mode 100644 libstdc++-v3/testsuite/23_containers/deque/requirements/do_the_right_thing.cc create mode 100644 libstdc++-v3/testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc create mode 100644 libstdc++-v3/testsuite/23_containers/list/requirements/do_the_right_thing.cc create mode 100644 libstdc++-v3/testsuite/23_containers/vector/requirements/do_the_right_thing.cc create mode 100644 libstdc++-v3/testsuite/ext/vstring/requirements/do_the_right_thing.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 800738e81bf5..5f3f3cddbaa8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,85 @@ +2012-03-04 Paolo Carlini <paolo.carlini@oracle.com> + Jonathan Wakely <jwakely.gcc@gmail.com> + + 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. + 2012-03-04 Jonathan Wakely <jwakely.gcc@gmail.com> PR libstdc++/52433 diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h index 0fc8323767ba..9ccf7554aaae 100644 --- a/libstdc++-v3/include/bits/forward_list.h +++ b/libstdc++-v3/include/bits/forward_list.h @@ -1,6 +1,6 @@ // <forward_list.h> -*- 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * [@a __first,@a __last). This is linear in N (where N is * distance(@a __first,@a __last)). */ - template<typename _InputIterator> + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * that the resulting %forward_list's size is the same as the number * of elements assigned. Old data may be lost. */ - template<typename _InputIterator> - void + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void assign(_InputIterator __first, _InputIterator __last) { clear(); @@ -905,7 +903,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * This operation is linear in the number of elements inserted and * does not invalidate iterators and references. */ - template<typename _InputIterator> + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> iterator insert_after(const_iterator __pos, _InputIterator __first, _InputIterator __last); @@ -1207,16 +1206,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { this->_M_impl._M_head._M_reverse_after(); } private: - template<typename _Integer> - void - _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) - { _M_fill_initialize(static_cast<size_type>(__n), __x); } - // Called by the range constructor to implement [23.1.1]/9 template<typename _InputIterator> 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. diff --git a/libstdc++-v3/include/bits/forward_list.tcc b/libstdc++-v3/include/bits/forward_list.tcc index 83f32c4e2990..99fa3a016096 100644 --- a/libstdc++-v3/include/bits/forward_list.tcc +++ b/libstdc++-v3/include/bits/forward_list.tcc @@ -1,6 +1,6 @@ // <forward_list.tcc> -*- 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _InputIterator> 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER } } - // 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<typename _Tp, typename _Alloc> void forward_list<_Tp, _Alloc>:: @@ -258,7 +256,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER } template<typename _Tp, typename _Alloc> - template<typename _InputIterator> + template<typename _InputIterator, typename> typename forward_list<_Tp, _Alloc>::iterator forward_list<_Tp, _Alloc>:: insert_after(const_iterator __pos, diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h index bec63ff03f97..ec3f83d98d60 100644 --- a/libstdc++-v3/include/bits/stl_bvector.h +++ b/libstdc++-v3/include/bits/stl_bvector.h @@ -1,7 +1,7 @@ // vector<bool> 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 @@ template<typename _Alloc> } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + vector(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { _M_initialize_dispatch(__first, __last, __false_type()); } +#else template<typename _InputIterator> vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type()) @@ -565,6 +573,7 @@ template<typename _Alloc> typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_initialize_dispatch(__first, __last, _Integral()); } +#endif ~vector() _GLIBCXX_NOEXCEPT { } @@ -610,6 +619,13 @@ template<typename _Alloc> assign(size_type __n, const bool& __x) { _M_fill_assign(__n, __x); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void + assign(_InputIterator __first, _InputIterator __last) + { _M_assign_dispatch(__first, __last, __false_type()); } +#else template<typename _InputIterator> void assign(_InputIterator __first, _InputIterator __last) @@ -617,6 +633,7 @@ template<typename _Alloc> typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_assign_dispatch(__first, __last, _Integral()); } +#endif #ifdef __GXX_EXPERIMENTAL_CXX0X__ void @@ -806,6 +823,14 @@ template<typename _Alloc> return begin() + __n; } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void + insert(iterator __position, + _InputIterator __first, _InputIterator __last) + { _M_insert_dispatch(__position, __first, __last, __false_type()); } +#else template<typename _InputIterator> void insert(iterator __position, @@ -814,6 +839,7 @@ template<typename _Alloc> 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) diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index b92491793567..d8904199a7c8 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * 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<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + deque(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { _M_initialize_dispatch(__first, __last, __false_type()); } +#else template<typename _InputIterator> deque(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type()) @@ -897,6 +905,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * resulting %deque's size is the same as the number of elements * assigned. Old data may be lost. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void + assign(_InputIterator __first, _InputIterator __last) + { _M_assign_dispatch(__first, __last, __false_type()); } +#else template<typename _InputIterator> void assign(_InputIterator __first, _InputIterator __last) @@ -986,6 +1002,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_assign_dispatch(__first, __last, _Integral()); } +#endif #ifdef __GXX_EXPERIMENTAL_CXX0X__ /** @@ -1510,6 +1527,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * [__first,__last) into the %deque before the location specified * by @a __position. This is known as <em>range insert</em>. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void + insert(iterator __position, _InputIterator __first, + _InputIterator __last) + { _M_insert_dispatch(__position, __first, __last, __false_type()); } +#else template<typename _InputIterator> void insert(iterator __position, _InputIterator __first, @@ -1519,6 +1544,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_insert_dispatch(__position, __first, __last, _Integral()); } +#endif /** * @brief Remove element at given position. diff --git a/libstdc++-v3/include/bits/stl_iterator_base_types.h b/libstdc++-v3/include/bits/stl_iterator_base_types.h index 9944dc44102b..1f56c061df5d 100644 --- a/libstdc++-v3/include/bits/stl_iterator_base_types.h +++ b/libstdc++-v3/include/bits/stl_iterator_base_types.h @@ -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 <bits/c++config.h> #ifdef __GXX_EXPERIMENTAL_CXX0X__ -# include <type_traits> // For _GLIBCXX_HAS_NESTED_TYPE +# include <type_traits> // For _GLIBCXX_HAS_NESTED_TYPE, is_convertible #endif namespace std _GLIBCXX_VISIBILITY(default) @@ -222,6 +223,14 @@ _GLIBCXX_HAS_NESTED_TYPE(iterator_category) { return __it.base(); } }; +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InIter> + using _RequireInputIter = typename + enable_if<is_convertible<typename + iterator_traits<_InIter>::iterator_category, + input_iterator_tag>::value>::type; +#endif + _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index e422de88e609..1e760ede693f 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * [@a __first,@a __last). This is linear in N (where N is * distance(@a __first,@a __last)). */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + 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<typename _InputIterator> list(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type()) @@ -647,6 +655,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * 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<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void + assign(_InputIterator __first, _InputIterator __last) + { _M_assign_dispatch(__first, __last, __false_type()); } +#else template<typename _InputIterator> void assign(_InputIterator __first, _InputIterator __last) @@ -733,6 +749,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_assign_dispatch(__first, __last, _Integral()); } +#endif #ifdef __GXX_EXPERIMENTAL_CXX0X__ /** @@ -1148,7 +1165,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * This operation is linear in the number of elements inserted and * does not invalidate iterators and references. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<typename _InputIterator> +#endif void insert(iterator __position, _InputIterator __first, _InputIterator __last) diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index ec21807321df..239f8b9dd360 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * used, then this will do at most 2N calls to the copy * constructor, and logN memory reallocations. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + vector(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Base(__a) + { _M_initialize_dispatch(__first, __last, __false_type()); } +#else template<typename _InputIterator> vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type()) @@ -392,6 +400,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 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 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * 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<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void + assign(_InputIterator __first, _InputIterator __last) + { _M_assign_dispatch(__first, __last, __false_type()); } +#else template<typename _InputIterator> void assign(_InputIterator __first, _InputIterator __last) @@ -505,6 +521,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_assign_dispatch(__first, __last, _Integral()); } +#endif #ifdef __GXX_EXPERIMENTAL_CXX0X__ /** @@ -1035,6 +1052,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * %vector and if it is frequently used the user should * consider using std::list. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void + insert(iterator __position, _InputIterator __first, + _InputIterator __last) + { _M_insert_dispatch(__position, __first, __last, __false_type()); } +#else template<typename _InputIterator> void insert(iterator __position, _InputIterator __first, @@ -1044,6 +1069,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER typedef typename std::__is_integer<_InputIterator>::__type _Integral; _M_insert_dispatch(__position, __first, __last, _Integral()); } +#endif /** * @brief Remove element at given position. diff --git a/libstdc++-v3/include/debug/deque b/libstdc++-v3/include/debug/deque index 07b332b01911..ce09cb26ab73 100644 --- a/libstdc++-v3/include/debug/deque +++ b/libstdc++-v3/include/debug/deque @@ -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 @@ namespace __debug : _Base(__n, __value, __a) { } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif deque(_InputIterator __first, _InputIterator __last, const _Allocator& __a = _Allocator()) : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, @@ -142,7 +148,12 @@ namespace __debug } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif void assign(_InputIterator __first, _InputIterator __last) { @@ -413,7 +424,12 @@ namespace __debug this->_M_invalidate_all(); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif void insert(iterator __position, _InputIterator __first, _InputIterator __last) diff --git a/libstdc++-v3/include/debug/forward_list b/libstdc++-v3/include/debug/forward_list index b74b38a02bc2..9024ff904063 100644 --- a/libstdc++-v3/include/debug/forward_list +++ b/libstdc++-v3/include/debug/forward_list @@ -1,6 +1,6 @@ // <forward_list> -*- 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 @@ namespace __debug : _Base(__n, __value, __al) { } - template<typename _InputIterator> - forward_list(_InputIterator __first, _InputIterator __last, + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + 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 @@ namespace __debug return *this; } - template<typename _InputIterator> - void + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + void assign(_InputIterator __first, _InputIterator __last) { __glibcxx_check_valid_range(__first, __last); @@ -273,7 +275,8 @@ namespace __debug this); } - template<typename _InputIterator> + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> iterator insert_after(const_iterator __pos, _InputIterator __first, _InputIterator __last) diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index 3931a3d3b683..856ba1a60e22 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -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,14 +90,18 @@ namespace __debug : _Base(__n, __value, __a) { } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> - 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 @@ namespace __debug } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif void assign(_InputIterator __first, _InputIterator __last) { @@ -405,7 +415,12 @@ namespace __debug _Base::insert(__position.base(), __n, __x); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif void insert(iterator __position, _InputIterator __first, _InputIterator __last) diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector index 5ee0fabc32a1..d0b2627a6201 100644 --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -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 @@ namespace __debug : _Base(__n, __value, __a), _M_guaranteed_capacity(__n) { } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif vector(_InputIterator __first, _InputIterator __last, const _Allocator& __a = _Allocator()) : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, @@ -170,7 +176,12 @@ namespace __debug } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<typename _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<typename _InputIterator> +#endif void assign(_InputIterator __first, _InputIterator __last) { @@ -476,7 +487,12 @@ namespace __debug _M_update_guaranteed_capacity(); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif void insert(iterator __position, _InputIterator __first, _InputIterator __last) diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h index 8c4120a3be2c..48e3d461eef7 100644 --- a/libstdc++-v3/include/ext/vstring.h +++ b/libstdc++-v3/include/ext/vstring.h @@ -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 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @param __end End of range. * @param __a Allocator to use (default is default allocator). */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif __versa_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a = _Alloc()) : __vstring_base(__beg, __end, __a) { } @@ -762,7 +767,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * * Appends characters in the range [first,last) to this string. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif __versa_string& append(_InputIterator __first, _InputIterator __last) { return this->replace(_M_iend(), _M_iend(), __first, __last); } @@ -886,7 +896,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * Sets value of string to characters in the range * [first,last). */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif __versa_string& assign(_InputIterator __first, _InputIterator __last) { return this->replace(_M_ibegin(), _M_iend(), __first, __last); } @@ -931,7 +946,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * thrown. The value of the string doesn't change if an error * is thrown. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> +#else template<class _InputIterator> +#endif void insert(iterator __p, _InputIterator __beg, _InputIterator __end) { this->replace(__p, __p, __beg, __end); } @@ -1367,6 +1387,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * 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<class _InputIterator, + typename = std::_RequireInputIter<_InputIterator>> + __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<class _InputIterator> __versa_string& replace(iterator __i1, iterator __i2, @@ -1378,6 +1412,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION 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. diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/do_the_right_thing.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/do_the_right_thing.cc new file mode 100644 index 000000000000..0555d4ce2d9d --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/do_the_right_thing.cc @@ -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 +// <http://www.gnu.org/licenses/>. + +#include <deque> + +// libstdc++/43813 +void test01() +{ + std::deque<double*> d(7, 0); + d.assign(7, 0); + d.insert(d.begin(), 7, 0); +} diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc index 006041dc5f78..a86e94643a26 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1670 } +// { dg-error "no matching" "" { target *-*-* } 1696 } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc index c7ed29a21048..da53d4f806d1 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1603 } +// { dg-error "no matching" "" { target *-*-* } 1629 } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc index e390f44b565c..10ecf6e5e81f 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1603 } +// { dg-error "no matching" "" { target *-*-* } 1629 } #include <deque> #include <utility> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc index ed81d582fdff..f77b9a779364 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1754 } +// { dg-error "no matching" "" { target *-*-* } 1780 } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc new file mode 100644 index 000000000000..35e963943302 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc @@ -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 +// <http://www.gnu.org/licenses/>. + +#include <forward_list> + +// libstdc++/43813 +void test01() +{ + std::forward_list<double*> fl(7, 0); + fl.assign(7, 0); + fl.insert_after(fl.before_begin(), 7, 0); +} diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc index 774c728ddab3..c49a9c1d271e 100644 --- a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc @@ -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 diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc index e19698d61405..a5632c46b1b4 100644 --- a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc @@ -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 diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc index 1d7fdb8a2a33..c9cf26979142 100644 --- a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc @@ -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 diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc index 12dd38e76e4e..fcd31fb067bc 100644 --- a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc @@ -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 diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/do_the_right_thing.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/do_the_right_thing.cc new file mode 100644 index 000000000000..7dbb4f309f1f --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/do_the_right_thing.cc @@ -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 +// <http://www.gnu.org/licenses/>. + +#include <list> + +// libstdc++/43813 +void test01() +{ + std::list<double*> l(7, 0); + l.assign(7, 0); + l.insert(l.begin(), 7, 0); +} diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc index 42f28db9ab35..c088e6c5f116 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1552 } +// { dg-error "no matching" "" { target *-*-* } 1574 } #include <list> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc index d4a446408f4b..94fbe9afebbc 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1508 } +// { dg-error "no matching" "" { target *-*-* } 1530 } #include <list> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc index fb32ee497f52..c02d5a5426d0 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1508 } +// { dg-error "no matching" "" { target *-*-* } 1530 } #include <list> #include <utility> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc index d34be99e155b..c2fa73716f23 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1508 } +// { dg-error "no matching" "" { target *-*-* } 1530 } #include <list> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/do_the_right_thing.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/do_the_right_thing.cc new file mode 100644 index 000000000000..4419496872dd --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/do_the_right_thing.cc @@ -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 +// <http://www.gnu.org/licenses/>. + +#include <vector> + +// libstdc++/43813 +void test01() +{ + std::vector<double*> v(7, 0); + v.assign(7, 0); + v.insert(v.begin(), 7, 0); +} diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc index 1855fddafbd3..73de8aed9e86 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1225 } +// { dg-error "no matching" "" { target *-*-* } 1251 } #include <vector> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc index 9c05486e35b8..fa479c730949 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1155 } +// { dg-error "no matching" "" { target *-*-* } 1181 } #include <vector> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc index 152393c15dca..231cacebb973 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1155 } +// { dg-error "no matching" "" { target *-*-* } 1181 } #include <vector> #include <utility> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc index f44ae63eb99d..b8e18bb4d4bf 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini <pcarlini@suse.de> -// 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 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1266 } +// { dg-error "no matching" "" { target *-*-* } 1292 } #include <vector> diff --git a/libstdc++-v3/testsuite/ext/vstring/requirements/do_the_right_thing.cc b/libstdc++-v3/testsuite/ext/vstring/requirements/do_the_right_thing.cc new file mode 100644 index 000000000000..cd68d06f8674 --- /dev/null +++ b/libstdc++-v3/testsuite/ext/vstring/requirements/do_the_right_thing.cc @@ -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 +// <http://www.gnu.org/licenses/>. + +#include <ext/vstring.h> + +// libstdc++/43813 +void test01() +{ + __gnu_cxx::__versa_string<double*> 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); +} -- GitLab