Commit 93889749 by Jonathan Wakely Committed by Jonathan Wakely

re PR libstdc++/58594 (std::make_shared does not accept const types as parameters)

	PR libstdc++/58594
	* include/bits/shared_ptr_base.h: Real fix for cv-qualified types.

From-SVN: r218698
parent 80d8f379
2014-12-13 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/58594
* include/bits/shared_ptr_base.h: Real fix for cv-qualified types.
2014-12-12 Jonathan Wakely <jwakely@redhat.com> 2014-12-12 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/64241 PR libstdc++/64241
......
...@@ -1106,7 +1106,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1106,7 +1106,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Alloc> template<typename _Alloc>
struct _Deleter struct _Deleter
{ {
void operator()(_Tp* __ptr) void operator()(typename _Alloc::value_type* __ptr)
{ {
__allocated_ptr<_Alloc> __guard{ _M_alloc, __ptr }; __allocated_ptr<_Alloc> __guard{ _M_alloc, __ptr };
allocator_traits<_Alloc>::destroy(_M_alloc, __guard.get()); allocator_traits<_Alloc>::destroy(_M_alloc, __guard.get());
...@@ -1123,14 +1123,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1123,14 +1123,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
rebind_traits<typename std::remove_cv<_Tp>::type> __traits; rebind_traits<typename std::remove_cv<_Tp>::type> __traits;
_Deleter<typename __traits::allocator_type> __del = { __a }; _Deleter<typename __traits::allocator_type> __del = { __a };
auto __guard = std::__allocate_guarded(__del._M_alloc); auto __guard = std::__allocate_guarded(__del._M_alloc);
_M_ptr = __guard.get(); auto __ptr = __guard.get();
// _GLIBCXX_RESOLVE_LIB_DEFECTS // _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2070. allocate_shared should use allocator_traits<A>::construct // 2070. allocate_shared should use allocator_traits<A>::construct
__traits::construct(__del._M_alloc, _M_ptr, __traits::construct(__del._M_alloc, __ptr,
std::forward<_Args>(__args)...); std::forward<_Args>(__args)...);
__guard = nullptr; __guard = nullptr;
__shared_count<_Lp> __count(_M_ptr, __del, __del._M_alloc); __shared_count<_Lp> __count(__ptr, __del, __del._M_alloc);
_M_refcount._M_swap(__count); _M_refcount._M_swap(__count);
_M_ptr = __ptr;
__enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr); __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment