diff --git a/libcxx/docs/Status/Cxx20Issues.csv b/libcxx/docs/Status/Cxx20Issues.csv --- a/libcxx/docs/Status/Cxx20Issues.csv +++ b/libcxx/docs/Status/Cxx20Issues.csv @@ -102,7 +102,7 @@ "`2943 `__","Problematic specification of the wide version of ``basic_filebuf::open``\ ","San Diego","|Nothing To Do|","" "`2960 `__","[fund.ts.v3] ``nonesuch``\ is insufficiently useless","San Diego","|Complete|","" "`2995 `__","``basic_stringbuf``\ default constructor forbids it from using SSO capacity","San Diego","","" -"`2996 `__","Missing rvalue overloads for ``shared_ptr``\ operations","San Diego","|Complete|","" +"`2996 `__","Missing rvalue overloads for ``shared_ptr``\ operations","San Diego","|Complete|","16.0" "`3008 `__","``make_shared``\ (sub)object destruction semantics are not specified","San Diego","","" "`3022 `__","``is_convertible``\ may lead to ODR","San Diego","Resolved by 1285R0","" "`3025 `__","Map-like container deduction guides should use ``pair``\ , not ``pair``\ ","San Diego","|Complete|","" diff --git a/libcxx/include/__memory/shared_ptr.h b/libcxx/include/__memory/shared_ptr.h --- a/libcxx/include/__memory/shared_ptr.h +++ b/libcxx/include/__memory/shared_ptr.h @@ -593,7 +593,7 @@ #if _LIBCPP_STD_VER > 20 template - _LIBCPP_HIDE_FROM_ABI shared_ptr(shared_ptr<_Yp>&& __r, element_type* __p) _NOEXCEPT + _LIBCPP_HIDE_FROM_ABI shared_ptr(shared_ptr<_Yp>&& __r, element_type* __p) noexcept : __ptr_(__p), __cntrl_(__r.__cntrl_) { __r.__ptr_ = nullptr; @@ -678,7 +678,7 @@ { typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; typedef __shared_ptr_pointer::pointer, _Dp, _AllocT> _CntrlBlk; - __cntrl_ = new _CntrlBlk(__r.get(), _VSTD::move(__r.get_deleter()), _AllocT()); + __cntrl_ = new _CntrlBlk(__r.get(), std::move(__r.get_deleter()), _AllocT()); __enable_weak_this(__r.get(), __r.get()); } __r.release(); @@ -1385,8 +1385,8 @@ #if _LIBCPP_STD_VER > 20 template -inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> static_pointer_cast(shared_ptr<_Up>&& __r) _NOEXCEPT { - return shared_ptr<_Tp>(_VSTD::move(__r), static_cast::element_type*>(__r.get())); +_LIBCPP_HIDE_FROM_ABI shared_ptr<_Tp> static_pointer_cast(shared_ptr<_Up>&& __r) noexcept { + return shared_ptr<_Tp>(std::move(__r), static_cast::element_type*>(__r.get())); } #endif @@ -1402,10 +1402,9 @@ #if _LIBCPP_STD_VER > 20 template -inline _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> dynamic_pointer_cast(shared_ptr<_Up>&& __r) _NOEXCEPT { - typedef typename shared_ptr<_Tp>::element_type _ET; - _ET* __p = dynamic_cast<_ET*>(__r.get()); - return __p ? shared_ptr<_Tp>(_VSTD::move(__r), __p) : shared_ptr<_Tp>(); +_LIBCPP_HIDE_FROM_ABI shared_ptr<_Tp> dynamic_pointer_cast(shared_ptr<_Up>&& __r) noexcept { + auto* __p = dynamic_cast::element_type*>(__r.get()); + return __p ? shared_ptr<_Tp>(std::move(__r), __p) : shared_ptr<_Tp>(); } #endif @@ -1419,9 +1418,8 @@ #if _LIBCPP_STD_VER > 20 template -_LIBCPP_HIDE_FROM_ABI shared_ptr<_Tp> const_pointer_cast(shared_ptr<_Up>&& __r) _NOEXCEPT { - typedef typename shared_ptr<_Tp>::element_type _RTp; - return shared_ptr<_Tp>(_VSTD::move(__r), const_cast<_RTp*>(__r.get())); +_LIBCPP_HIDE_FROM_ABI shared_ptr<_Tp> const_pointer_cast(shared_ptr<_Up>&& __r) noexcept { + return shared_ptr<_Tp>(std::move(__r), const_cast::element_type*>(__r.get())); } #endif @@ -1436,8 +1434,8 @@ #if _LIBCPP_STD_VER > 20 template -_LIBCPP_HIDE_FROM_ABI shared_ptr<_Tp> reinterpret_pointer_cast(shared_ptr<_Up>&& __r) _NOEXCEPT { - return shared_ptr<_Tp>(_VSTD::move(__r), reinterpret_cast< typename shared_ptr<_Tp>::element_type*>(__r.get())); +_LIBCPP_HIDE_FROM_ABI shared_ptr<_Tp> reinterpret_pointer_cast(shared_ptr<_Up>&& __r) noexcept { + return shared_ptr<_Tp>(std::move(__r), reinterpret_cast::element_type*>(__r.get())); } #endif diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/const_pointer_cast.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/const_pointer_cast.pass.cpp --- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/const_pointer_cast.pass.cpp +++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/const_pointer_cast.pass.cpp @@ -10,8 +10,8 @@ // shared_ptr -// template shared_ptr const_pointer_cast(const shared_ptr& r); -// template shared_ptr const_pointer_cast(shared_ptr&& r); +// template shared_ptr const_pointer_cast(const shared_ptr& r) noexcept; +// template shared_ptr const_pointer_cast(shared_ptr&& r) noexcept; #include #include @@ -47,6 +47,7 @@ { { const std::shared_ptr pA(new A); + ASSERT_NOEXCEPT(std::const_pointer_cast(pA)); std::shared_ptr pB = std::const_pointer_cast(pA); assert(pB.get() == pA.get()); assert(!pB.owner_before(pA) && !pA.owner_before(pB)); @@ -69,6 +70,7 @@ { A* pA_raw = new A; std::shared_ptr pA(pA_raw); + ASSERT_NOEXCEPT(std::const_pointer_cast(std::move(pA))); std::shared_ptr pB = std::const_pointer_cast(std::move(pA)); assert(pA.get() == nullptr); assert(pB.get() == pA_raw); diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/dynamic_pointer_cast.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/dynamic_pointer_cast.pass.cpp --- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/dynamic_pointer_cast.pass.cpp +++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/dynamic_pointer_cast.pass.cpp @@ -10,8 +10,8 @@ // shared_ptr -// template shared_ptr dynamic_pointer_cast(const shared_ptr& r); -// template shared_ptr dynamic_pointer_cast(shared_ptr&& r); +// template shared_ptr dynamic_pointer_cast(const shared_ptr& r) noexcept; +// template shared_ptr dynamic_pointer_cast(shared_ptr&& r) noexcept; // UNSUPPORTED: no-rtti @@ -49,6 +49,7 @@ { { const std::shared_ptr pB(new A); + ASSERT_NOEXCEPT(std::dynamic_pointer_cast(pB)); std::shared_ptr pA = std::dynamic_pointer_cast(pB); assert(pA.get() == pB.get()); assert(!pB.owner_before(pA) && !pA.owner_before(pB)); @@ -71,6 +72,7 @@ { A* pA_raw = new A; std::shared_ptr pB(pA_raw); + ASSERT_NOEXCEPT(std::dynamic_pointer_cast(std::move(pB))); std::shared_ptr pA = std::dynamic_pointer_cast(std::move(pB)); assert(pB.get() == nullptr); assert(pA.get() == pA_raw); diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/reinterpret_pointer_cast.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/reinterpret_pointer_cast.pass.cpp --- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/reinterpret_pointer_cast.pass.cpp +++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/reinterpret_pointer_cast.pass.cpp @@ -32,6 +32,7 @@ int main(int, char**) { { const std::shared_ptr pA(new A); + ASSERT_NOEXCEPT(std::reinterpret_pointer_cast(pA)); std::shared_ptr pi = std::reinterpret_pointer_cast(pA); std::shared_ptr pA2 = std::reinterpret_pointer_cast(pi); assert(pA2.get() == pA.get()); @@ -77,6 +78,7 @@ { A* pA_raw = new A; std::shared_ptr pA(pA_raw); + ASSERT_NOEXCEPT(std::reinterpret_pointer_cast(std::move(pA))); std::shared_ptr pi = std::reinterpret_pointer_cast(std::move(pA)); assert(pA.get() == nullptr); assert(pi.use_count() == 1); diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/static_pointer_cast.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/static_pointer_cast.pass.cpp --- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/static_pointer_cast.pass.cpp +++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/static_pointer_cast.pass.cpp @@ -10,8 +10,8 @@ // shared_ptr -// template shared_ptr static_pointer_cast(const shared_ptr& r); -// template shared_ptr static_pointer_cast(shared_ptr&& r); +// template shared_ptr static_pointer_cast(const shared_ptr& r) noexcept; +// template shared_ptr static_pointer_cast(shared_ptr&& r) noexcept; #include #include @@ -47,6 +47,7 @@ { { const std::shared_ptr pA(new A); + ASSERT_NOEXCEPT(std::static_pointer_cast(pA)); std::shared_ptr pB = std::static_pointer_cast(pA); assert(pB.get() == pA.get()); assert(!pB.owner_before(pA) && !pA.owner_before(pB)); @@ -87,6 +88,7 @@ { A* pA_raw = new A; std::shared_ptr pA(pA_raw); + ASSERT_NOEXCEPT(std::static_pointer_cast(std::move(pA))); std::shared_ptr pB = std::static_pointer_cast(std::move(pA)); assert(pA.get() == nullptr); assert(pB.get() == pA_raw);