]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/51626 ([C++0x] can't use C++98 allocators with -std=c++0x)
authorJonathan Wakely <jwakely.gcc@gmail.com>
Wed, 21 Dec 2011 18:35:40 +0000 (18:35 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 21 Dec 2011 18:35:40 +0000 (18:35 +0000)
PR libstdc++/51626
* include/bits/stl_uninitialized.h (_Construct_default_a_impl): Define
overloaded functions to conditionally use allocator::construct.
(_Construct_default_a): Define to dispatch to appropriate
_Construct_default_a_impl overload.
(__uninitialized_default_a, __uninitialized_default_n_a): Use
_Construct_default_a.
* testsuite/20_util/allocator/51626.cc: New.

From-SVN: r182600

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_uninitialized.h
libstdc++-v3/testsuite/20_util/allocator/51626.cc [new file with mode: 0644]

index 4da64988d4cc628a3458ba69df732a3cbfc6948d..7c3255590be4b28e8a5d7c0ec077587ffab730ce 100644 (file)
@@ -1,3 +1,14 @@
+2011-12-19  Jonathan Wakely  <jwakely.gcc@gmail.com>
+
+       PR libstdc++/51626
+       * include/bits/stl_uninitialized.h (_Construct_default_a_impl): Define
+       overloaded functions to conditionally use allocator::construct.
+       (_Construct_default_a): Define to dispatch to appropriate
+       _Construct_default_a_impl overload.
+       (__uninitialized_default_a, __uninitialized_default_n_a): Use
+       _Construct_default_a.
+       * testsuite/20_util/allocator/51626.cc: New.
+
 2011-12-19  Jonathan Wakely  <jwakely.gcc@gmail.com>
 
        * testsuite/ext/type_traits/remove_unsigned_integer_neg.cc: Adjust
index f15be3aee3b60798853e6d833e9a271523cf8388..70ce545b86ee4880d298e942f77f02c77f39a264 100644 (file)
@@ -1,7 +1,7 @@
 // Raw memory manipulators -*- C++ -*-
 
 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
-// 2009, 2010
+// 2009, 2010, 2011
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -530,6 +530,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        __uninit_default_n(__first, __n);
     }
 
+ template<typename _Tp, typename _Allocator>
+   inline auto
+   _Construct_default_a_impl(_Tp* __ptr, _Allocator& __alloc, void*)
+   -> decltype(__alloc.construct(__ptr))
+   { return __alloc.construct(__ptr); }
+
+  template<typename _Tp, typename _Allocator>
+   inline void
+   _Construct_default_a_impl(_Tp* __ptr, _Allocator& __alloc, ...)
+   { _Construct(__ptr); }
+
+  template<typename _Tp, typename _Allocator>
+   inline void
+   _Construct_default_a(_Tp* __ptr, _Allocator& __alloc)
+   { _Construct_default_a_impl(__ptr, __alloc, nullptr); }
 
   // __uninitialized_default_a
   // Fills [first, last) with std::distance(first, last) default
@@ -544,7 +559,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __try
        {
          for (; __cur != __last; ++__cur)
-           __alloc.construct(std::__addressof(*__cur));
+           _Construct_default_a(std::__addressof(*__cur), __alloc);
        }
       __catch(...)
        {
@@ -573,7 +588,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __try
        {
          for (; __n > 0; --__n, ++__cur)
-           __alloc.construct(std::__addressof(*__cur));
+           _Construct_default_a(std::__addressof(*__cur), __alloc);
        }
       __catch(...)
        {
diff --git a/libstdc++-v3/testsuite/20_util/allocator/51626.cc b/libstdc++-v3/testsuite/20_util/allocator/51626.cc
new file mode 100644 (file)
index 0000000..951aa18
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright (C) 2011 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/>.
+
+// { dg-options "-std=gnu++0x" }
+
+#include <memory>
+#include <vector>
+#include <testsuite_hooks.h>
+
+int count = 0;
+
+template <class T>
+  struct allocator98 : std::allocator<T>
+  {
+    template <class U> struct rebind { typedef allocator98<U> other; };
+
+    allocator98() { }
+
+    template <class U> allocator98(const allocator98<U>&) { };
+
+    void construct(T* p, const T& val)
+    {
+      ++count;
+      std::allocator<T>::construct(p, val);
+    }
+  };
+
+template <class T>
+  struct allocator11 : std::allocator<T>
+  {
+    template <class U> struct rebind { typedef allocator11<U> other; };
+
+    allocator11() { }
+
+    template <class U> allocator11(const allocator11<U>&) { };
+
+    template<typename... Args>
+      void construct(T* p, Args&&... args)
+      {
+       ++count;
+       std::allocator<T>::construct(p, std::forward<Args>(args)...);
+      }
+  };
+
+int main()
+{
+  std::vector< int, allocator98<int> > v98(1);
+  VERIFY( count == 0 );
+
+  std::vector< int, allocator11<int> > v11(1);
+  VERIFY( count == 1 );
+}