Patchwork [v3] reorder headers in <memory>

login
register
mail settings
Submitter Jonathan Wakely
Date Aug. 3, 2012, 12:28 a.m.
Message ID <CAH6eHdT-Zr--vK1+=0K-q9hDSL6BhF2+Sroiw8cVemfSJO4B9A@mail.gmail.com>
Download mbox | patch
Permalink /patch/174820/
State New
Headers show

Comments

Jonathan Wakely - Aug. 3, 2012, 12:28 a.m.
As suggested a few weeks ago on the libstdc++ list, this patch tweaks
the include order in <memory>, allowing internal library headers to
use shared_ptr and unique_ptr without depending on
<backward/auto_ptr.h>.

        * include/std/memory: Include auto_ptr.h later.
        * include/bits/shared_ptr.h (shared_ptr(auto_ptr<_Up>&&): Remove
        definition.
        * include/bits/shared_ptr_base.h (__shared_ptr(auto_ptr<_Up>&&):
        Likewise.
        * include/bits/unique_ptr.h (unique_ptr(auto_ptr<_Up>&&): Likewise.
        * include/backward/auto_ptr.h (unique_ptr(auto_ptr<_Up>&&): Define.
        (shared_ptr(auto_ptr<_Up>&&, __shared_ptr(auto_ptr<_Up>&&): Likewise.
        * include/std/future: Reduce header dependencies.
        * testsuite/20_util/default_delete/48631_neg.cc: Adjust dg-error line
        numbers.
        * testsuite/20_util/shared_ptr/cons/43820_neg.cc: Likewise.
        * testsuite/20_util/unique_ptr/assign/48635_neg.cc: Likewise.

Tested x86_64-linux, committed to trunk.
commit 9386ced4bfd9990046d2dec6a080478c8cc01c50
Author: Jonathan Wakely <jwakely.gcc@gmail.com>
Date:   Fri Aug 3 01:25:19 2012 +0100

    	* include/std/memory: Include auto_ptr.h later.
    	* include/bits/shared_ptr.h (shared_ptr(auto_ptr<_Up>&&): Remove
    	definition.
    	* include/bits/shared_ptr_base.h (__shared_ptr(auto_ptr<_Up>&&):
    	Likewise.
    	* include/bits/unique_ptr.h (unique_ptr(auto_ptr<_Up>&&): Likewise.
    	* include/backward/auto_ptr.h (unique_ptr(auto_ptr<_Up>&&): Define.
    	(shared_ptr(auto_ptr<_Up>&&, __shared_ptr(auto_ptr<_Up>&&): Likewise.
    	* include/std/future: Reduce header dependencies.
    	* testsuite/20_util/default_delete/48631_neg.cc: Adjust dg-error line
    	numbers.
    	* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Likewise.
    	* testsuite/20_util/unique_ptr/assign/48635_neg.cc: Likewise.

Patch

diff --git a/libstdc++-v3/include/backward/auto_ptr.h b/libstdc++-v3/include/backward/auto_ptr.h
index 3c91c08..01702f7 100644
--- a/libstdc++-v3/include/backward/auto_ptr.h
+++ b/libstdc++-v3/include/backward/auto_ptr.h
@@ -1,6 +1,6 @@ 
 // auto_ptr implementation -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2007-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
@@ -289,6 +289,40 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef void element_type;
     } _GLIBCXX_DEPRECATED;
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+  template<_Lock_policy _Lp>
+  template<typename _Tp>
+    inline
+    __shared_count<_Lp>::__shared_count(std::auto_ptr<_Tp>&& __r)
+    : _M_pi(new _Sp_counted_ptr<_Tp*, _Lp>(__r.get()))
+    { __r.release(); }
+
+  template<typename _Tp, _Lock_policy _Lp>
+  template<typename _Tp1>
+    inline
+    __shared_ptr<_Tp, _Lp>::__shared_ptr(std::auto_ptr<_Tp1>&& __r)
+    : _M_ptr(__r.get()), _M_refcount()
+    {
+      __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+      static_assert( sizeof(_Tp1) > 0, "incomplete type" );
+      _Tp1* __tmp = __r.get();
+      _M_refcount = __shared_count<_Lp>(std::move(__r));
+      __enable_shared_from_this_helper(_M_refcount, __tmp, __tmp);
+    }
+
+  template<typename _Tp>
+  template<typename _Tp1>
+    inline
+    shared_ptr<_Tp>::shared_ptr(std::auto_ptr<_Tp1>&& __r)
+    : __shared_ptr<_Tp>(std::move(__r)) { }
+
+  template<typename _Tp, typename _Dp>
+  template<typename _Up, typename>
+    inline
+    unique_ptr<_Tp, _Dp>::unique_ptr(auto_ptr<_Up>&& __u) noexcept
+    : _M_t(__u.release(), deleter_type()) { }
+#endif
+
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
 
diff --git a/libstdc++-v3/include/bits/shared_ptr.h b/libstdc++-v3/include/bits/shared_ptr.h
index 070d2d1..e1c1eb9 100644
--- a/libstdc++-v3/include/bits/shared_ptr.h
+++ b/libstdc++-v3/include/bits/shared_ptr.h
@@ -1,6 +1,6 @@ 
 // shared_ptr and weak_ptr implementation -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2007-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
@@ -250,8 +250,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 #if _GLIBCXX_USE_DEPRECATED
       template<typename _Tp1>
-	shared_ptr(std::auto_ptr<_Tp1>&& __r)
-	: __shared_ptr<_Tp>(std::move(__r)) { }
+	shared_ptr(std::auto_ptr<_Tp1>&& __r);
 #endif
 
       template<typename _Tp1, typename _Del>
diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h
index 39449f1..1ccd5ef 100644
--- a/libstdc++-v3/include/bits/shared_ptr_base.h
+++ b/libstdc++-v3/include/bits/shared_ptr_base.h
@@ -1,7 +1,6 @@ 
 // shared_ptr and weak_ptr implementation details -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012
-// Free Software Foundation, Inc.
+// Copyright (C) 2007-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
@@ -54,6 +53,10 @@  namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
+#if _GLIBCXX_USE_DEPRECATED
+  template<typename> class auto_ptr;
+#endif
+
  /**
    *  @brief  Exception possibly thrown by @c shared_ptr.
    *  @ingroup exceptions
@@ -537,9 +540,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       // Special case for auto_ptr<_Tp> to provide the strong guarantee.
       template<typename _Tp>
         explicit
-	__shared_count(std::auto_ptr<_Tp>&& __r)
-	: _M_pi(new _Sp_counted_ptr<_Tp*, _Lp>(__r.get()))
-	{ __r.release(); }
+	__shared_count(std::auto_ptr<_Tp>&& __r);
 #endif
 
       // Special case for unique_ptr<_Tp,_Del> to provide the strong guarantee.
@@ -859,15 +860,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if _GLIBCXX_USE_DEPRECATED
       // Postcondition: use_count() == 1 and __r.get() == 0
       template<typename _Tp1>
-	__shared_ptr(std::auto_ptr<_Tp1>&& __r)
-	: _M_ptr(__r.get()), _M_refcount()
-	{
-	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
-	  static_assert( sizeof(_Tp1) > 0, "incomplete type" );
-	  _Tp1* __tmp = __r.get();
-	  _M_refcount = __shared_count<_Lp>(std::move(__r));
-	  __enable_shared_from_this_helper(_M_refcount, __tmp, __tmp);
-	}
+	__shared_ptr(std::auto_ptr<_Tp1>&& __r);
 #endif
 
       /* TODO: use delegating constructor */
diff --git a/libstdc++-v3/include/bits/unique_ptr.h b/libstdc++-v3/include/bits/unique_ptr.h
index 0a12799..9b736d4 100644
--- a/libstdc++-v3/include/bits/unique_ptr.h
+++ b/libstdc++-v3/include/bits/unique_ptr.h
@@ -1,6 +1,6 @@ 
 // unique_ptr implementation -*- C++ -*-
 
-// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2008-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
@@ -45,6 +45,10 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
    * @{
    */
 
+#if _GLIBCXX_USE_DEPRECATED
+  template<typename> class auto_ptr;
+#endif
+
   /// Primary template, default_delete.
   template<typename _Tp>
     struct default_delete
@@ -161,8 +165,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	std::enable_if<std::is_convertible<_Up*, _Tp*>::value
 		       && std::is_same<_Dp,
 				       default_delete<_Tp>>::value>::type>
-	unique_ptr(auto_ptr<_Up>&& __u) noexcept
-	: _M_t(__u.release(), deleter_type()) { }
+	unique_ptr(auto_ptr<_Up>&& __u) noexcept;
 #endif
 
       // Destructor.
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future
index 962400b..a8d7112 100644
--- a/libstdc++-v3/include/std/future
+++ b/libstdc++-v3/include/std/future
@@ -1,6 +1,6 @@ 
 // <future> -*- C++ -*-
 
-// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+// Copyright (C) 2009-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
@@ -36,14 +36,16 @@ 
 #else
 
 #include <functional>
-#include <memory>
 #include <mutex>
 #include <thread>
 #include <condition_variable>
 #include <system_error>
-#include <exception>
 #include <atomic>
 #include <bits/functexcept.h>
+#include <bits/unique_ptr.h>
+#include <bits/shared_ptr.h>
+#include <bits/uses_allocator.h>
+#include <bits/alloc_traits.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/std/memory b/libstdc++-v3/include/std/memory
index e846eba..73482ff 100644
--- a/libstdc++-v3/include/std/memory
+++ b/libstdc++-v3/include/std/memory
@@ -1,8 +1,6 @@ 
 // <memory> -*- C++ -*-
 
-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
-// 2009, 2010, 2011
-// Free Software Foundation, Inc.
+// Copyright (C) 2001-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
@@ -80,11 +78,11 @@ 
 #  include <type_traits>
 #  include <functional>
 #  include <debug/debug.h>
+#  include <bits/unique_ptr.h>
+#  include <bits/shared_ptr.h>
 #  if _GLIBCXX_USE_DEPRECATED
 #    include <backward/auto_ptr.h>
 #  endif
-#  include <bits/unique_ptr.h>
-#  include <bits/shared_ptr.h>
 #else
 #  include <backward/auto_ptr.h>
 #endif
diff --git a/libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc b/libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc
index 9d779ac..a9bba97 100644
--- a/libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc
@@ -1,7 +1,7 @@ 
 // { dg-options "-std=gnu++0x " }
 // { dg-do compile }
 
-// Copyright (C) 2011 Free Software Foundation
+// Copyright (C) 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
@@ -27,4 +27,4 @@  struct D : B { };
 D d;
 std::default_delete<B[]> db;
 typedef decltype(db(&d)) type; // { dg-error "use of deleted function" }
-// { dg-error "declared here" "" { target *-*-* } 83 }
+// { dg-error "declared here" "" { target *-*-* } 87 }
diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
index d2110ca..dc9d803 100644
--- a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
@@ -1,7 +1,7 @@ 
 // { dg-options "-std=gnu++0x" }
 // { dg-do compile }
 
-// Copyright (C) 2010, 2011, 2012 Free Software Foundation
+// Copyright (C) 2010-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
@@ -32,9 +32,9 @@  void test01()
 {
   X* px = 0;
   std::shared_ptr<X> p1(px);   // { dg-error "here" }
-  // { dg-error "incomplete" "" { target *-*-* } 775 }
+  // { dg-error "incomplete" "" { target *-*-* } 776 }
 
   std::shared_ptr<X> p9(ap());  // { dg-error "here" }
-  // { dg-error "incomplete" "" { target *-*-* } 869 }
+  // { dg-error "incomplete" "" { target *-*-* } 310 }
 
 }
diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc
index 1ed53ee..d72821e 100644
--- a/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc
@@ -1,7 +1,7 @@ 
 // { dg-options "-std=gnu++0x" }
 // { dg-do compile }
 
-// Copyright (C) 2011 Free Software Foundation
+// Copyright (C) 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
@@ -41,10 +41,10 @@  void f()
   std::unique_ptr<int, B&> ub(nullptr, b);
   std::unique_ptr<int, D&> ud(nullptr, d);
   ub = std::move(ud);
-// { dg-error "use of deleted function" "" { target *-*-* } 189 }
+// { dg-error "use of deleted function" "" { target *-*-* } 192 }
 
   std::unique_ptr<int[], B&> uba(nullptr, b);
   std::unique_ptr<int[], D&> uda(nullptr, d);
   uba = std::move(uda);
-// { dg-error "use of deleted function" "" { target *-*-* } 329 }
+// { dg-error "use of deleted function" "" { target *-*-* } 332 }
 }