shared_ptr_base.h (__shared_count(unique_ptr&&)): Check for nullptr (LWG 2415).
authorJonathan Wakely <jwakely@redhat.com>
Wed, 13 May 2015 16:42:18 +0000 (17:42 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 13 May 2015 16:42:18 +0000 (17:42 +0100)
* include/bits/shared_ptr_base.h (__shared_count(unique_ptr&&)): Check
for nullptr (LWG 2415).
* testsuite/20_util/shared_ptr/cons/unique_ptr_deleter.cc: Test
construction from empty unique_ptr.
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust dg-error.
* testsuite/20_util/shared_ptr/cons/void_neg.cc: Likewise.

From-SVN: r223170

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/shared_ptr_base.h
libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
libstdc++-v3/testsuite/20_util/shared_ptr/cons/unique_ptr_deleter.cc
libstdc++-v3/testsuite/20_util/shared_ptr/cons/void_neg.cc

index 965cdccaa05444cc96aa3307859cc23b8ccfe9c9..b9a0ad7f8dc726861d53000a9f79c600a0cc1336 100644 (file)
@@ -1,5 +1,12 @@
 2015-05-13  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/bits/shared_ptr_base.h (__shared_count(unique_ptr&&)): Check
+       for nullptr (LWG 2415).
+       * testsuite/20_util/shared_ptr/cons/unique_ptr_deleter.cc: Test
+       construction from empty unique_ptr.
+       * testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust dg-error.
+       * testsuite/20_util/shared_ptr/cons/void_neg.cc: Likewise.
+
        * include/bits/stl_raw_storage_iter.h (raw_storage_iterator::base()):
        Define (LWG 2454).
        * testsuite/20_util/raw_storage_iterator/base.cc: New.
index 8c3af1285a98964f3268f78b6641b44bfe87a5c2..081df8781a3702895509bd950685907c32f669e9 100644 (file)
@@ -632,6 +632,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         explicit
        __shared_count(std::unique_ptr<_Tp, _Del>&& __r) : _M_pi(0)
        {
+         // _GLIBCXX_RESOLVE_LIB_DEFECTS
+         // 2415. Inconsistency between unique_ptr and shared_ptr
+         if (__r.get() == nullptr)
+           return;
+
          using _Ptr = typename unique_ptr<_Tp, _Del>::pointer;
          using _Del2 = typename conditional<is_reference<_Del>::value,
              reference_wrapper<typename remove_reference<_Del>::type>,
index 97cc139be2c3ee3c686c425d253a62a457b1b7c9..62555225432e4ac6202511dd413e94057c3982c7 100644 (file)
@@ -32,7 +32,7 @@ void test01()
 {
   X* px = 0;
   std::shared_ptr<X> p1(px);   // { dg-error "here" }
-  // { dg-error "incomplete" "" { target *-*-* } 886 }
+  // { dg-error "incomplete" "" { target *-*-* } 891 }
 
   std::shared_ptr<X> p9(ap());  // { dg-error "here" }
   // { dg-error "incomplete" "" { target *-*-* } 307 }
index 67bf577c37829a2e659d0bade2edcda37266e125..e0109777eddb6f8b235613204d006dad0856577c 100644 (file)
@@ -34,7 +34,7 @@ int D::count = 0;
 // 20.7.12.2.1 shared_ptr constructors [util.smartptr.shared.const]
 
 // Construction from unique_ptr
-int
+void
 test01()
 {
   bool test __attribute__((unused)) = true;
@@ -47,13 +47,25 @@ test01()
       VERIFY( sp.use_count() == 1 );
   }
   VERIFY( D::count == 1 );
+}
 
-  return 0;
+void
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  D::count = 0;
+  std::unique_ptr<A, D> up;
+  {
+    std::shared_ptr<A> sp = std::move(up);
+  }
+  VERIFY( D::count == 0 ); // LWG 2415
 }
 
 int
 main()
 {
   test01();
+  test02();
   return 0;
 }
index 2afcd8bb7d7c056ef73f4ad55e7ab4408ee6ddbb..3f6c4ae97fc18cdbb068afa2f48b023fe9fa1620 100644 (file)
@@ -25,5 +25,5 @@
 void test01()
 {
   std::shared_ptr<void> p((void*)nullptr);   // { dg-error "here" }
-  // { dg-error "incomplete" "" { target *-*-* } 885 }
+  // { dg-error "incomplete" "" { target *-*-* } 890 }
 }