Patchwork fix libstdc++/52924

login
register
mail settings
Submitter Jonathan Wakely
Date April 11, 2012, 11:13 p.m.
Message ID <CAH6eHdQ6uKkWqnirHO8=Cto9GOScdJFL4XJtbHzR_aJJwTzjsQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/151924/
State New
Headers show

Comments

Jonathan Wakely - April 11, 2012, 11:13 p.m.
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.

Tested x86_64-linux, committed to trunk and 4.7
commit bab6adfa9c9cf5d3fd47c5eeffe7c4f58091ef3d
Author: Jonathan Wakely <jwakely.gcc@gmail.com>
Date:   Wed Apr 11 10:05:00 2012 +0100

    	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.

Patch

diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h
index c48c18e..39449f1 100644
--- a/libstdc++-v3/include/bits/shared_ptr_base.h
+++ b/libstdc++-v3/include/bits/shared_ptr_base.h
@@ -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); }
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 39f9ce3..d2110ca 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
@@ -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
index 0000000..0cd6bad
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/52924.cc
@@ -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);