On 8 October 2013 13:33, Jonathan Wakely wrote:
> PR libstdc++/58659
> * include/bits/shared_ptr_base.h
> (__shared_count::__shared_count(P,D)):
> Delegate to constructor taking allocator.
> (__shared_count::_S_create_from_up): Inline into ...
> (__shared_count::__shared_count(unique_ptr<Y,D>&&): Here. Use
> std::conditional instead of constrained overloads. Allocate memory
> using the allocator type that will be used for deallocation.
> * testsuite/20_util/shared_ptr/cons/58659.cc: New.
> * testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust.
>
> Tested x86_64-linux, committed to trunk.
I've committed the same change to the 4.8 branch, except that the
dummy allocator type passed by the delegating constructor to the
target constructor is std::allocator<int> instead of
std::allocator<void>:
+ __shared_count(_Ptr __p, _Deleter __d)
+ : __shared_count(__p, std::move(__d), allocator<int>())
+ { }
That's the type that was already used, so users will get the same
specialization of _Sp_counted_deleter with 4.8.2 as with 4.8.1.
On the trunk I changed it to std::allocator<void> to be consistent
with the type used when constructing from a unique_ptr. That should
mean slightly smaller executables in cases like this:
std::shared_ptr<X> sp1(new X, std::default_delete<X>());
std::shared_ptr<X> sp2(std::unique_ptr<X>(new X));
On trunk the same _Sp_counted_deleter specialization will be used by
sp1 and sp2.