diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2023-03-22 21:54:24 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2023-03-22 23:13:40 +0000 |
commit | a495b738e4a89a8104798d005fd09474bbb916ff (patch) | |
tree | 0bc1a5f1432c4f6c3ff07be78a3024efc912cb7d | |
parent | 6b2740946d26ffde7e1318f24bae00443ece387d (diff) | |
download | gcc-a495b738e4a89a8104798d005fd09474bbb916ff.zip gcc-a495b738e4a89a8104798d005fd09474bbb916ff.tar.gz gcc-a495b738e4a89a8104798d005fd09474bbb916ff.tar.bz2 |
libstdc++: Fix assigning nullptr to std::atomic<shared_ptr<T>> (LWG 3893)
LWG voted this to Tentatively Ready recently.
libstdc++-v3/ChangeLog:
* include/bits/shared_ptr_atomic.h (atomic::operator=(nullptr_t)):
Add overload, as per LWG 3893.
* testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc:
Check assignment from nullptr.
-rw-r--r-- | libstdc++-v3/include/bits/shared_ptr_atomic.h | 6 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc | 9 |
2 files changed, 15 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/shared_ptr_atomic.h b/libstdc++-v3/include/bits/shared_ptr_atomic.h index d142616..2295b48 100644 --- a/libstdc++-v3/include/bits/shared_ptr_atomic.h +++ b/libstdc++-v3/include/bits/shared_ptr_atomic.h @@ -650,6 +650,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator=(shared_ptr<_Tp> __desired) noexcept { _M_impl.swap(__desired, memory_order_seq_cst); } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3893. LWG 3661 broke atomic<shared_ptr<T>> a; a = nullptr; + void + operator=(nullptr_t) noexcept + { store(nullptr); } + shared_ptr<_Tp> exchange(shared_ptr<_Tp> __desired, memory_order __o = memory_order_seq_cst) noexcept diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc index a190274..54cf262 100644 --- a/libstdc++-v3/testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc +++ b/libstdc++-v3/testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc @@ -145,6 +145,14 @@ test_counting() VERIFY( counter == 2 ); } +void +test_lwg3893() +{ + // LWG 3893. LWG 3661 broke atomic<shared_ptr<T>> a; a = nullptr; + std::atomic<std::shared_ptr<int>> a; + a = nullptr; +} + int main() { @@ -152,4 +160,5 @@ main() test_atomic_shared_ptr(); test_wait_notify(); test_counting(); + test_lwg3893(); } |