re PR libstdc++/36949 ([C++0x] make_shared does not initialize enable_shared_from_this' internal shared_count)
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. From-SVN: r138219
This commit is contained in:
parent
4d2ad64c5b
commit
08df5d3e97
|
@ -1,3 +1,11 @@
|
||||||
|
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>
|
2008-07-24 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR libstdc++/36924
|
PR libstdc++/36924
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// <tr1_impl/boost_shared_ptr.h> -*- C++ -*-
|
// <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
|
// 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
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
@ -505,13 +505,14 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
|
||||||
// This constructor is non-standard, it is used by allocate_shared.
|
// This constructor is non-standard, it is used by allocate_shared.
|
||||||
template<typename _Alloc, typename... _Args>
|
template<typename _Alloc, typename... _Args>
|
||||||
__shared_ptr(_Sp_make_shared_tag __tag, _Alloc __a, _Args&&... __args)
|
__shared_ptr(_Sp_make_shared_tag __tag, _Alloc __a, _Args&&... __args)
|
||||||
: _M_ptr()
|
: _M_ptr(), _M_refcount(__tag, (_Tp*)0, __a,
|
||||||
, _M_refcount(__tag, (_Tp*)0, __a, std::forward<_Args>(__args)...)
|
std::forward<_Args>(__args)...)
|
||||||
{
|
{
|
||||||
// _M_ptr needs to point to the newly constructed object.
|
// _M_ptr needs to point to the newly constructed object.
|
||||||
// This relies on _Sp_counted_ptr_inplace::_M_get_deleter.
|
// 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);
|
_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,
|
template<typename _Tp1, _Lock_policy _Lp1, typename _Alloc,
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
// { 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;
|
||||||
|
}
|
Loading…
Reference in New Issue