+2008-07-28 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR libstdc++/36949
+ * include/tr1_impl/boost_shared_ptr.h
+ (__shared_ptr(_Sp_make_shared_tag, _Alloc, _Args&&...): Call
+ __enable_shared_from_this_helper.
+ * testsuite/20_util/shared_ptr/creation/36949.cc: New.
+
2008-07-24 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/36924
// <tr1_impl/boost_shared_ptr.h> -*- C++ -*-
-// Copyright (C) 2007 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008 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
// This constructor is non-standard, it is used by allocate_shared.
template<typename _Alloc, typename... _Args>
__shared_ptr(_Sp_make_shared_tag __tag, _Alloc __a, _Args&&... __args)
- : _M_ptr()
- , _M_refcount(__tag, (_Tp*)0, __a, std::forward<_Args>(__args)...)
+ : _M_ptr(), _M_refcount(__tag, (_Tp*)0, __a,
+ std::forward<_Args>(__args)...)
{
// _M_ptr needs to point to the newly constructed object.
// This relies on _Sp_counted_ptr_inplace::_M_get_deleter.
- void * __p = _M_refcount._M_get_deleter(typeid(__tag));
+ void* __p = _M_refcount._M_get_deleter(typeid(__tag));
_M_ptr = static_cast<_Tp*>(__p);
+ __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
}
template<typename _Tp1, _Lock_policy _Lp1, typename _Alloc,
--- /dev/null
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2008 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 2, 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 COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+#include <memory>
+
+struct A : std::enable_shared_from_this<A> { };
+
+// libstdc++/36949
+void test01()
+{
+ std::make_shared<A>()->shared_from_this();
+}
+
+int main()
+{
+ test01();
+ return 0;
+}