OSDN Git Service

PR libstdc++/52924
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Apr 2012 23:13:44 +0000 (23:13 +0000)
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Apr 2012 23:13:44 +0000 (23:13 +0000)
* include/bits/shared_ptr_base.h (_Sp_counted_deleter): Add
user-defined destructor.
(_Sp_counted_inplace): Likewise.
* testsuite/20_util/shared_ptr/cons/52924.cc: New.
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust dg-error
line numbers.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186367 138bc75d-0d04-0410-961f-82ee72b054a4

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/52924.cc [new file with mode: 0644]

index cd24fb1..1235dc9 100644 (file)
@@ -1,5 +1,15 @@
 2012-04-11  Jonathan Wakely  <jwakely.gcc@gmail.com>
 
+       PR libstdc++/52924
+       * include/bits/shared_ptr_base.h (_Sp_counted_deleter): Add
+       user-defined destructor.
+       (_Sp_counted_inplace): Likewise.
+       * testsuite/20_util/shared_ptr/cons/52924.cc: New.
+       * testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust dg-error
+       line numbers.
+
+2012-04-11  Jonathan Wakely  <jwakely.gcc@gmail.com>
+
        * testsuite/performance/30_threads/future/polling.cc: Adjust.
 
 2012-04-11  Jonathan Wakely  <jwakely.gcc@gmail.com>
index c48c18e..39449f1 100644 (file)
@@ -343,6 +343,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       _Sp_counted_deleter(_Ptr __p, _Deleter __d, const _Alloc& __a)
       : _M_ptr(__p), _M_del(__d, __a) { }
 
+      ~_Sp_counted_deleter() noexcept { }
+
       virtual void
       _M_dispose() noexcept
       { _M_del._M_del(_M_ptr); }
@@ -401,6 +403,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
              std::forward<_Args>(__args)...); // might throw
        }
 
+      ~_Sp_counted_ptr_inplace() noexcept { }
+
       virtual void
       _M_dispose() noexcept
       { allocator_traits<_Alloc>::destroy(_M_impl, _M_impl._M_ptr); }
index 39f9ce3..d2110ca 100644 (file)
@@ -32,9 +32,9 @@ void test01()
 {
   X* px = 0;
   std::shared_ptr<X> p1(px);   // { dg-error "here" }
-  // { dg-error "incomplete" "" { target *-*-* } 771 }
+  // { dg-error "incomplete" "" { target *-*-* } 775 }
 
   std::shared_ptr<X> p9(ap());  // { dg-error "here" }
-  // { dg-error "incomplete" "" { target *-*-* } 865 }
+  // { dg-error "incomplete" "" { target *-*-* } 869 }
 
 }
diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/52924.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/52924.cc
new file mode 100644 (file)
index 0000000..0cd6bad
--- /dev/null
@@ -0,0 +1,44 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// Copyright (C) 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
+// 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>
+
+// libstdc++/52924
+
+struct A { } a;
+
+struct D {
+  ~D() noexcept(false) { }
+  void operator()(A*) { }
+} d;
+
+auto sp = std::shared_ptr<A>(&a, d);
+
+template<typename T>
+struct Alloc : std::allocator<T>
+{
+  Alloc() = default;
+  ~Alloc() noexcept(false) { }
+  template<typename U> Alloc(const Alloc<U>&) { }
+};
+
+Alloc<A> al;
+
+auto as = std::allocate_shared<A>(al);