]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
shared_ptr (__shared_ptr): Assert non-void pointer.
authorJonathan Wakely <jwakely.gcc@gmail.com>
Wed, 30 Oct 2013 19:48:52 +0000 (19:48 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 30 Oct 2013 19:48:52 +0000 (19:48 +0000)
* include/bits/shared_ptr (__shared_ptr): Assert non-void pointer.
* include/bits/shared_ptr (default_delete): Likewise.
* testsuite/20_util/shared_ptr/cons/58839.cc: Do not use
default_delete<void>.
* testsuite/20_util/shared_ptr/cons/void_neg.cc: New.
* testsuite/20_util/default_delete/void_neg.cc: New.
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust line numbers.
* testsuite/20_util/unique_ptr/assign/48635_neg.cc: Likewise.

From-SVN: r204225

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/shared_ptr_base.h
libstdc++-v3/include/bits/unique_ptr.h
libstdc++-v3/testsuite/20_util/default_delete/void_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
libstdc++-v3/testsuite/20_util/shared_ptr/cons/58839.cc
libstdc++-v3/testsuite/20_util/shared_ptr/cons/void_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/unique_ptr/assign/48635_neg.cc

index 1cc290a650fbb2b5abbae2bcf0f27afccf826118..4a3b3584c03f893c606e08c35ae456acb3eb3ea2 100644 (file)
@@ -1,3 +1,14 @@
+2013-10-30  Jonathan Wakely  <jwakely.gcc@gmail.com>
+
+       * include/bits/shared_ptr (__shared_ptr): Assert non-void pointer.
+       * include/bits/shared_ptr (default_delete): Likewise.
+       * testsuite/20_util/shared_ptr/cons/58839.cc: Do not use
+       default_delete<void>.
+       * testsuite/20_util/shared_ptr/cons/void_neg.cc: New.
+       * testsuite/20_util/default_delete/void_neg.cc: New.
+       * testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust line numbers.
+       * testsuite/20_util/unique_ptr/assign/48635_neg.cc: Likewise.
+
 2013-10-29  Jonathan Wakely  <jwakely.gcc@gmail.com>
 
        PR libstdc++/58839
index 91b63677b73816e22178090167c7130434c1f44d..cf90d7a7cb3ae4c7f9846d3c4f8b986e6795e8b2 100644 (file)
@@ -775,6 +775,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         : _M_ptr(__p), _M_refcount(__p)
        {
          __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+         static_assert( !is_void<_Tp>::value, "incomplete type" );
          static_assert( sizeof(_Tp1) > 0, "incomplete type" );
          __enable_shared_from_this_helper(_M_refcount, __p, __p);
        }
index c6c9a5a04a5ce68128e6b819556d2b3f15ff3f49..bfe40ecb9311601846616c18f98ddbb453c5aa9a 100644 (file)
@@ -69,6 +69,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       void
       operator()(_Tp* __ptr) const
       {
+       static_assert(!is_void<_Tp>::value,
+                     "can't delete pointer to incomplete type");
        static_assert(sizeof(_Tp)>0,
                      "can't delete pointer to incomplete type");
        delete __ptr;
diff --git a/libstdc++-v3/testsuite/20_util/default_delete/void_neg.cc b/libstdc++-v3/testsuite/20_util/default_delete/void_neg.cc
new file mode 100644 (file)
index 0000000..79786cb
--- /dev/null
@@ -0,0 +1,30 @@
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+
+// 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/>.
+
+// 20.8.1.1 Default deleters [util.ptr.dltr]
+
+#include <memory>
+
+void test01()
+{
+  std::default_delete<void> d;
+  d(nullptr);   // { dg-error "here" }
+  // { dg-error "incomplete" "" { target *-*-* } 72 }
+}
index fd2a677e0c7b4dcdd027de4e491ab83468eaae37..db3fcaced525fb768b7bc1cc4756343be22b69e8 100644 (file)
@@ -32,7 +32,7 @@ void test01()
 {
   X* px = 0;
   std::shared_ptr<X> p1(px);   // { dg-error "here" }
-  // { dg-error "incomplete" "" { target *-*-* } 778 }
+  // { dg-error "incomplete" "" { target *-*-* } 779 }
 
   std::shared_ptr<X> p9(ap());  // { dg-error "here" }
   // { dg-error "incomplete" "" { target *-*-* } 307 }
index 6ad256461ea00e72144bcac3d644895d3125c8e5..f78a07fb2c6ec98b267a67dde75a60088122aef0 100644 (file)
 
 // libstdc++/58839
 
+struct D {
+  void operator()(void*) const noexcept { }
+};
+
 void test01()
 {
-  std::unique_ptr<void> y;
+  std::unique_ptr<void, D> y;
   std::shared_ptr<void> x = std::move(y);
 }
diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/void_neg.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/void_neg.cc
new file mode 100644 (file)
index 0000000..3fd38cf
--- /dev/null
@@ -0,0 +1,29 @@
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+
+// 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/>.
+
+// 20.8.2.2 Template class shared_ptr [util.smartptr.shared]
+
+#include <memory>
+
+void test01()
+{
+  std::shared_ptr<void> p((void*)nullptr);   // { dg-error "here" }
+  // { dg-error "incomplete" "" { target *-*-* } 778 }
+}
index c78564270f4199d7e0dec6c1ff44036456cf6114..fdffafceadb2a8054eb3664e6bac00570949dbab 100644 (file)
@@ -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 *-*-* } 270 }
+// { dg-error "use of deleted function" "" { target *-*-* } 272 }
 
   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 *-*-* } 515 }
+// { dg-error "use of deleted function" "" { target *-*-* } 517 }
 }