]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/43813 ([DR1234] vector<T*>(3, NULL) fails to compile)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 5 Mar 2012 01:15:28 +0000 (01:15 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 5 Mar 2012 01:15:28 +0000 (01:15 +0000)
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

34 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/forward_list.h
libstdc++-v3/include/bits/forward_list.tcc
libstdc++-v3/include/bits/stl_bvector.h
libstdc++-v3/include/bits/stl_deque.h
libstdc++-v3/include/bits/stl_iterator_base_types.h
libstdc++-v3/include/bits/stl_list.h
libstdc++-v3/include/bits/stl_vector.h
libstdc++-v3/include/debug/deque
libstdc++-v3/include/debug/forward_list
libstdc++-v3/include/debug/list
libstdc++-v3/include/debug/vector
libstdc++-v3/include/ext/vstring.h
libstdc++-v3/testsuite/23_containers/deque/requirements/do_the_right_thing.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc
libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc
libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc
libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc
libstdc++-v3/testsuite/23_containers/forward_list/requirements/do_the_right_thing.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc
libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc
libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc
libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc
libstdc++-v3/testsuite/23_containers/list/requirements/do_the_right_thing.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc
libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc
libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc
libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc
libstdc++-v3/testsuite/23_containers/vector/requirements/do_the_right_thing.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc
libstdc++-v3/testsuite/ext/vstring/requirements/do_the_right_thing.cc [new file with mode: 0644]

index 800738e81bf5b2706a19b565827d537099c38a77..5f3f3cddbaa8226554900e94d172f10b5ac12f25 100644 (file)
@@ -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
index 0fc8323767ba7de7adbcc6159644cf131881c159..9ccf7554aaaedf865b9d4f8b4dc7373b550c3232 100644 (file)
@@ -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.
index 83f32c4e2990d33ab511a6b47643576a556f8087..99fa3a016096e8fcf9919af8dbc4799d89320151 100644 (file)
@@ -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,
index bec63ff03f9749330fe03b2313324dff6acb60a0..ec3f83d98d604b39ecc050f16dfd95c16a864d90 100644 (file)
@@ -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)
index b924917935670804a677202b519c62942b16b80b..d8904199a7c8e4e7dfa9e80a74ccc0c3618a5a61 100644 (file)
@@ -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.
index 9944dc44102b63b88e0ca421d26bd7f15b2469d4..1f56c061df5dbfdf04b3c57fd5a083921ffe7393 100644 (file)
@@ -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
 
index e422de88e60906d0535a7eadb4184e919bc5b5f9..1e760ede693fa258fbaad902c651505f4e12994b 100644 (file)
@@ -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)
index ec21807321df7d37f3a9b0a2f8e26de77e6e5ab3..239f8b9dd360218703a2457743e5dc9d5de1b81b 100644 (file)
@@ -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.
index 07b332b01911eedd8367a3243f21770a3f25ec76..ce09cb26ab733bcae256c0470cdb68e1795fc5e2 100644 (file)
@@ -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)
index b74b38a02bc22f06451574ed51b9628925ecd255..9024ff904063d534a2077ac9df25c1b285774ae1 100644 (file)
@@ -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)
index 3931a3d3b683e280db177b6cc8ed84d64f6dc2ec..856ba1a60e2218749cfe1934eb3f4aec757a06bc 100644 (file)
@@ -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)
index 5ee0fabc32a1849a4ac1fe3fa118f36377e844c2..d0b2627a6201ffae773fea0c4e256dbb9c150293 100644 (file)
@@ -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)
index 8c4120a3be2c7c716bd0324d5bc88b1e62aa6ef4..48e3d461eef77e49a85f1eb9ed2c61b0ef0f120f 100644 (file)
@@ -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 (file)
index 0000000..0555d4c
--- /dev/null
@@ -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);
+}
index 006041dc5f780c0f21c0b1e43b4c5441e9a25d0c..a86e94643a26be92f41f69133f5ad02c8455d0b9 100644 (file)
@@ -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>
 
index c7ed29a21048934fae038e24a47a7451abde0d57..da53d4f806d1407c27db01bcf06ffa3e6e944621 100644 (file)
@@ -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>
 
index e390f44b565cf3ff8333607002dfdd144f837274..10ecf6e5e81f70d89ba247488f6bda6575ac5a56 100644 (file)
@@ -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>
index ed81d582fdff6c5d43b683de964212a091674b7f..f77b9a7793646216d591db09b5386bf79a30e4f2 100644 (file)
@@ -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 (file)
index 0000000..35e9639
--- /dev/null
@@ -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);
+}
index 774c728ddab3445d9d845351e9f24a4f5127a9cc..c49a9c1d271eec9b60f0efb7921c7c2b939085fb 100644 (file)
@@ -1,8 +1,8 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1213 }
+// { dg-error "no matching" "" { target *-*-* } 33 }
 
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
index e19698d6140521640ca849af1f178e4720ea5bb7..a5632c46b1b49c100207eac23014ab26eb84bb9f 100644 (file)
@@ -1,8 +1,8 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1213 }
+// { dg-error "no matching" "" { target *-*-* } 27 }
 
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
index 1d7fdb8a2a33b3c661c5656b2f4739fe4e4d171c..c9cf26979142db9f397d2cb4e4469ddfeeb2c6f3 100644 (file)
@@ -1,8 +1,8 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1213 }
+// { dg-error "no matching" "" { target *-*-* } 28 }
 
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation
+// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
index 12dd38e76e4e4f7e7e7a70a065db1adf6c1aeb9d..fcd31fb067bcac4f612be76cda95ad3492268a31 100644 (file)
@@ -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 (file)
index 0000000..7dbb4f3
--- /dev/null
@@ -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);
+}
index 42f28db9ab35e4e38bc1ac6c1774ab2108e8fb71..c088e6c5f11699c9c0780806b2ad6dac804ed654 100644 (file)
@@ -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>
 
index d4a446408f4b7b20832cbb003f5fe5630905c228..94fbe9afebbc76baaf517dfdcc3b9f12bced3d30 100644 (file)
@@ -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>
 
index fb32ee497f52dcae8883fecfa832ad9bcce97174..c02d5a5426d038956709a8f1da1f1afd82cfd929 100644 (file)
@@ -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>
index d34be99e155b607ff472098100e487cdabeb3496..c2fa73716f2377c7d29d295e9408b9be590d1b32 100644 (file)
@@ -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 (file)
index 0000000..4419496
--- /dev/null
@@ -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);
+}
index 1855fddafbd387596d2c2aba3693eea4ca118e29..73de8aed9e8675828a9689980bcba08d80864a16 100644 (file)
@@ -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>
 
index 9c05486e35b83bfbad7ae0ff60bd15d2cef3fdba..fa479c73094919cdd02ab8325f1b8a5b4d72ddd4 100644 (file)
@@ -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>
 
index 152393c15dcaa8d3574d5e08c2ee49f4de5d8634..231cacebb97302e3d6bed4974376a4532632cd65 100644 (file)
@@ -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>
index f44ae63eb99d860765f5546e81aae2746b272b4d..b8e18bb4d4bfb62611eac1278fda8858b78cec2d 100644 (file)
@@ -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 (file)
index 0000000..cd68d06
--- /dev/null
@@ -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);
+}