PR libstdc++/55977 (partial, std::vector and std::deque bits)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 18 Mar 2013 10:15:56 +0000 (10:15 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 18 Mar 2013 10:15:56 +0000 (10:15 +0000)
2013-03-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR libstdc++/55977 (partial, std::vector and std::deque bits)
* include/bits/stl_vector.h (_M_range_initialize(_InputIterator,
_InputIterator, std::input_iterator_tag)): Use emplace_back.
* include/bits/deque.tcc (_M_range_initialize(_InputIterator,
_InputIterator, std::input_iterator_tag)): Likewise.
* testsuite/23_containers/vector/cons/55977.cc: New.
* testsuite/23_containers/deque/cons/55977.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
Adjust dg-error line number.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
Likewise.

From-SVN: r196774

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/deque.tcc
libstdc++-v3/include/bits/stl_vector.h
libstdc++-v3/testsuite/23_containers/deque/cons/55977.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/vector/cons/55977.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/insert_neg.cc

index 36c45b5125e252541d901e7c517a0bddf9a695b8..81426dc2a895ed7d3109c6db22fb89aff81c4f9b 100644 (file)
@@ -1,3 +1,17 @@
+2013-03-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR libstdc++/55977 (partial, std::vector and std::deque bits)
+       * include/bits/stl_vector.h (_M_range_initialize(_InputIterator,
+       _InputIterator, std::input_iterator_tag)): Use emplace_back.
+       * include/bits/deque.tcc (_M_range_initialize(_InputIterator,
+       _InputIterator, std::input_iterator_tag)): Likewise.
+       * testsuite/23_containers/vector/cons/55977.cc: New.
+       * testsuite/23_containers/deque/cons/55977.cc: Likewise.
+       * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
+       Adjust dg-error line number.
+       * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
+       Likewise.
+
 2013-03-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR libstdc++/55979
index 369e0eda531eed924f2b9fca888bf02920e2250b..89c5ef76ba65b6a099f7727218c9130991e92988 100644 (file)
@@ -381,7 +381,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
         __try
           {
             for (; __first != __last; ++__first)
+#if __cplusplus >= 201103L
+             emplace_back(*__first);
+#else
               push_back(*__first);
+#endif
           }
         __catch(...)
           {
index d880ba7790597065f643f5642c99058920fc76a2..69c6e278c067dfbeb7b68cac814f7fecab6b0d11 100644 (file)
@@ -1184,7 +1184,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
                            _InputIterator __last, std::input_iterator_tag)
         {
          for (; __first != __last; ++__first)
+#if __cplusplus >= 201103L
+           emplace_back(*__first);
+#else
            push_back(*__first);
+#endif
        }
 
       // Called by the second initialize_dispatch above
diff --git a/libstdc++-v3/testsuite/23_containers/deque/cons/55977.cc b/libstdc++-v3/testsuite/23_containers/deque/cons/55977.cc
new file mode 100644 (file)
index 0000000..ef2d7c0
--- /dev/null
@@ -0,0 +1,70 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2013 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 even 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 <memory>
+#include <utility>
+#include <deque>
+#include <iterator>
+
+template <class T>
+struct MyAllocator
+{
+  std::allocator<T> base;
+  typedef T         value_type;
+
+  // FIXME: these types shouldn't be required.
+  typedef T*        pointer;
+  typedef const T*  const_pointer;
+  typedef T&        reference;
+  typedef const T&  const_reference;
+  template <typename U>
+    struct rebind
+    { typedef MyAllocator<U> other; };
+
+  MyAllocator() = default;
+  template <class U>
+  MyAllocator(const MyAllocator<U>& other) : base(other.base) {}
+  T* allocate(std::size_t n) { return base.allocate(n); }
+  void deallocate(T* p, std::size_t n) { return base.deallocate(p, n); }
+  template <class U, class... Args>
+  void construct(U* p, Args&&... args)
+  {
+    ::new (static_cast<void*>(p)) U(std::forward<Args>(args)...);
+  }
+};
+
+struct A
+{
+private:
+  friend class MyAllocator<A>;
+  A(int value) : value(value) {}
+  int value;
+public:
+  A() : value() {}
+  int get() const { return value; }
+};
+
+void foo()
+{
+  std::deque<A, MyAllocator<A>> v1;
+  const int i = 1;
+  v1.emplace_back(i); // OK
+  std::deque<A, MyAllocator<A>> v2(std::istream_iterator<int>(), {}); // ERROR
+}
diff --git a/libstdc++-v3/testsuite/23_containers/vector/cons/55977.cc b/libstdc++-v3/testsuite/23_containers/vector/cons/55977.cc
new file mode 100644 (file)
index 0000000..295d6b1
--- /dev/null
@@ -0,0 +1,60 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2013 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 even 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 <memory>
+#include <utility>
+#include <vector>
+#include <iterator>
+
+template <class T>
+struct MyAllocator
+{
+  std::allocator<T> base;
+  typedef T value_type;
+  MyAllocator() = default;
+  template <class U>
+  MyAllocator(const MyAllocator<U>& other) : base(other.base) {}
+  T* allocate(std::size_t n) { return base.allocate(n); }
+  void deallocate(T* p, std::size_t n) { return base.deallocate(p, n); }
+  template <class U, class... Args>
+  void construct(U* p, Args&&... args)
+  {
+    ::new (static_cast<void*>(p)) U(std::forward<Args>(args)...);
+  }
+};
+
+struct A
+{
+private:
+  friend class MyAllocator<A>;
+  A(int value) : value(value) {}
+  int value;
+public:
+  A() : value() {}
+  int get() const { return value; }
+};
+
+void foo()
+{
+  std::vector<A, MyAllocator<A>> v1;
+  const int i = 1;
+  v1.emplace_back(i); // OK
+  std::vector<A, MyAllocator<A>> v2(std::istream_iterator<int>(), {}); // ERROR
+}
index aa7617365eaf3617dfd72b64cd439357f1e09ecb..64e46658bb8f55ea5a838963bc4ecb089ef7d1fa 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1236 }
+// { dg-error "no matching" "" { target *-*-* } 1240 }
 
 #include <vector>
 
index cc46be5805f7dda9d815893ffccee47ebca70931..a8d98cb8092fc52d5287b39ef253a4cc9911a065 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1277 }
+// { dg-error "no matching" "" { target *-*-* } 1281 }
 
 #include <vector>