re PR libstdc++/58594 (std::make_shared does not accept const types as parameters)
authorJonathan Wakely <jwakely@redhat.com>
Sat, 13 Dec 2014 00:44:17 +0000 (00:44 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Sat, 13 Dec 2014 00:44:17 +0000 (00:44 +0000)
PR libstdc++/58594
* include/bits/shared_ptr_base.h: Real fix for cv-qualified types.

From-SVN: r218698

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/shared_ptr_base.h

index a4ab4bfb5d452fb0372627e7f3f75730e1ffeb37..9137a9850176d28e9bd5ffdc25d24fc2a85d36b2 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR libstdc++/64241
index 3ef783fa356c2283055a4bd1015b57acd3a8d528..ad68c237ee236a80d87d97dd4611440243692b9a 100644 (file)
@@ -1106,7 +1106,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       template<typename _Alloc>
         struct _Deleter
         {
-          void operator()(_Tp* __ptr)
+          void operator()(typename _Alloc::value_type* __ptr)
           {
            __allocated_ptr<_Alloc> __guard{ _M_alloc, __ptr };
            allocator_traits<_Alloc>::destroy(_M_alloc, __guard.get());
@@ -1123,14 +1123,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
            rebind_traits<typename std::remove_cv<_Tp>::type> __traits;
          _Deleter<typename __traits::allocator_type> __del = { __a };
          auto __guard = std::__allocate_guarded(__del._M_alloc);
-         _M_ptr = __guard.get();
+         auto __ptr = __guard.get();
          // _GLIBCXX_RESOLVE_LIB_DEFECTS
          // 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)...);
          __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_ptr = __ptr;
          __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
        }
 #endif