[patch] fix libstdc++/58659

Jonathan Wakely jwakely.gcc@gmail.com
Tue Oct 8 13:42:00 GMT 2013


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.



More information about the Gcc-patches mailing list