https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89303

--- Comment #17 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #13)
> So if the two bugs have the same root cause, it seems to be a problem in
> __weak_count::_M_assign, failing to set _M_pi here:
> 
>       __weak_count&
>       operator=(const __shared_count<_Lp>& __r) noexcept
>       {
>         _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
>         if (__tmp != nullptr)
>           __tmp->_M_weak_add_ref();
>         if (_M_pi != nullptr)
>           _M_pi->_M_weak_release();
>         _M_pi = __tmp;
>         return *this;
>       }

This ends up inlined into:
std::__shared_ptr<blob, 0>::__shared_ptr<std::allocator<blob> > (struct
__shared_ptr * const this, struct _Sp_alloc_shared_tag __tag)

and the GIMPLE dumps for -O1 -fno-tree-pta and -O1 do look significantly
different, explaining why _M_weak_this._M_refcount._M_pi doesn't get set.

Reply via email to