[committed] libstdc++: Simplify std::shared_ptr construction from std::weak_ptr

Jonathan Wakely jwakely@redhat.com
Mon Oct 26 10:16:23 GMT 2020


On 26/10/20 08:07 +0100, Stephan Bergmann wrote:
>On 21/10/2020 22:14, Jonathan Wakely via Gcc-patches wrote:
>>The _M_add_ref_lock() and _M_add_ref_lock_nothrow() members of
>>_Sp_counted_base are very similar, except that the former throws an
>>exception when the use count is zero and the latter returns false. The
>>former (and its callers) can be implemented in terms of the latter.
>>This results in a small reduction in code size, because throwing an
>>exception now only happens in one place.
>>
>>libstdc++-v3/ChangeLog:
>>
>>	* include/bits/shared_ptr.h (shared_ptr(const weak_ptr&, nothrow_t)):
>>	Add noexcept.
>>	* include/bits/shared_ptr_base.h (_Sp_counted_base::_M_add_ref_lock):
>>	Remove specializations and just call _M_add_ref_lock_nothrow.
>>	(__shared_count, __shared_ptr): Use nullptr for null pointer
>>	constants.
>>	(__shared_count(const __weak_count&)): Use _M_add_ref_lock_nothrow
>>	instead of _M_add_ref_lock.
>>	(__shared_count(const __weak_count&, nothrow_t)): Add noexcept.
>>	(__shared_ptr::operator bool()): Add noexcept.
>>	(__shared_ptr(const __weak_ptr&, nothrow_t)): Add noexcept.
>>
>>Tested powerpc64le-linux. Committed to trunk.
>
>Clang now complains about
>
>>~gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/shared_ptr_base.h:230:5: error: '_M_add_ref_lock_nothrow' is missing exception specification 'noexcept'
>>    _M_add_ref_lock_nothrow()
>>    ^
>>~gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/shared_ptr_base.h:158:7: note: previous declaration is here
>>      _M_add_ref_lock_nothrow() noexcept;
>>      ^
>>~gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/shared_ptr_base.h:241:5: error: '_M_add_ref_lock_nothrow' is missing exception specification 'noexcept'
>>    _M_add_ref_lock_nothrow()
>>    ^
>>~gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/shared_ptr_base.h:158:7: note: previous declaration is here
>>      _M_add_ref_lock_nothrow() noexcept;
>>      ^
>>~gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/shared_ptr_base.h:255:5: error: '_M_add_ref_lock_nothrow' is missing exception specification 'noexcept'
>>    _M_add_ref_lock_nothrow()
>>    ^
>>~gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/shared_ptr_base.h:158:7: note: previous declaration is here
>>      _M_add_ref_lock_nothrow() noexcept;
>>      ^
>>~gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/shared_ptr_base.h:876:5: error: exception specification in declaration does not match previous declaration
>>    __shared_count(const __weak_count<_Lp>& __r, std::nothrow_t) noexcept
>>    ^
>>~gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/shared_ptr_base.h:696:16: note: previous declaration is here
>>      explicit __shared_count(const __weak_count<_Lp>& __r, std::nothrow_t);
>>               ^
>>4 errors generated.
>
>which would be fixed with

Committed, thanks.


>>diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h
>>index a9e1c9bb1d5..10c9c831411 100644
>>--- a/libstdc++-v3/include/bits/shared_ptr_base.h
>>+++ b/libstdc++-v3/include/bits/shared_ptr_base.h
>>@@ -227,7 +227,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>   template<>
>>     inline bool
>>     _Sp_counted_base<_S_single>::
>>-    _M_add_ref_lock_nothrow()
>>+    _M_add_ref_lock_nothrow() noexcept
>>     {
>>       if (_M_use_count == 0)
>>        return false;
>>@@ -238,7 +238,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>   template<>
>>     inline bool
>>     _Sp_counted_base<_S_mutex>::
>>-    _M_add_ref_lock_nothrow()
>>+    _M_add_ref_lock_nothrow() noexcept
>>     {
>>       __gnu_cxx::__scoped_lock sentry(*this);
>>       if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, 1) == 0)
>>@@ -252,7 +252,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>   template<>
>>     inline bool
>>     _Sp_counted_base<_S_atomic>::
>>-    _M_add_ref_lock_nothrow()
>>+    _M_add_ref_lock_nothrow() noexcept
>>     {
>>       // Perform lock-free add-if-not-zero operation.
>>       _Atomic_word __count = _M_get_use_count();
>>@@ -693,7 +693,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>       explicit __shared_count(const __weak_count<_Lp>& __r);
>>       // Does not throw if __r._M_get_use_count() == 0, caller must check.
>>-      explicit __shared_count(const __weak_count<_Lp>& __r, std::nothrow_t);
>>+      explicit __shared_count(const __weak_count<_Lp>& __r, std::nothrow_t) noexcept;
>>       ~__shared_count() noexcept
>>       {
>



More information about the Libstdc++ mailing list