summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2012-03-05 01:15:28 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2012-03-05 01:15:28 +0000
commit9c7351ae10e3e9401983af4ad6cb33fa14f9db5d (patch)
tree6c290c31ed518698ccc30d08c831ee001d0cde00
parent0fca2a367b6a129c7b05592a63bd9c860e346714 (diff)
downloadgcc-9c7351ae10e3e9401983af4ad6cb33fa14f9db5d.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184911 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog82
-rw-r--r--libstdc++-v3/include/bits/forward_list.h31
-rw-r--r--libstdc++-v3/include/bits/forward_list.tcc10
-rw-r--r--libstdc++-v3/include/bits/stl_bvector.h28
-rw-r--r--libstdc++-v3/include/bits/stl_deque.h28
-rw-r--r--libstdc++-v3/include/bits/stl_iterator_base_types.h13
-rw-r--r--libstdc++-v3/include/bits/stl_list.h24
-rw-r--r--libstdc++-v3/include/bits/stl_vector.h28
-rw-r--r--libstdc++-v3/include/debug/deque18
-rw-r--r--libstdc++-v3/include/debug/forward_list15
-rw-r--r--libstdc++-v3/include/debug/list31
-rw-r--r--libstdc++-v3/include/debug/vector18
-rw-r--r--libstdc++-v3/include/ext/vstring.h37
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/do_the_right_thing.cc29
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc29
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/do_the_right_thing.cc29
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/do_the_right_thing.cc29
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/ext/vstring/requirements/do_the_right_thing.cc31
34 files changed, 494 insertions, 80 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 800738e81bf..5f3f3cddbaa 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 0fc8323767b..9ccf7554aaa 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 83f32c4e299..99fa3a01609 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 bec63ff03f9..ec3f83d98d6 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 b9249179356..d8904199a7c 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 9944dc44102..1f56c061df5 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 e422de88e60..1e760ede693 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 ec21807321d..239f8b9dd36 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 07b332b0191..ce09cb26ab7 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 b74b38a02bc..9024ff90406 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 3931a3d3b68..856ba1a60e2 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 5ee0fabc32a..d0b2627a620 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 8c4120a3be2..48e3d461eef 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 00000000000..0555d4ce2d9
--- /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 006041dc5f7..a86e94643a2 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 c7ed29a2104..da53d4f806d 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 e390f44b565..10ecf6e5e81 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 ed81d582fdf..f77b9a77936 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 00000000000..35e96394330
--- /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 774c728ddab..c49a9c1d271 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 e19698d6140..a5632c46b1b 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 1d7fdb8a2a3..c9cf2697914 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 12dd38e76e4..fcd31fb067b 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 00000000000..7dbb4f309f1
--- /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 42f28db9ab3..c088e6c5f11 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 d4a446408f4..94fbe9afebb 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 fb32ee497f5..c02d5a5426d 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 d34be99e155..c2fa73716f2 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 00000000000..4419496872d
--- /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 1855fddafbd..73de8aed9e8 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 9c05486e35b..fa479c73094 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 152393c15dc..231cacebb97 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 f44ae63eb99..b8e18bb4d4b 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 00000000000..cd68d06f867
--- /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);
+}