Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Differential D135548 Diff 468702 libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/const_pointer_cast.pass.cpp
Changeset View
Changeset View
Standalone View
Standalone View
libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.cast/const_pointer_cast.pass.cpp
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | |||||||||
// | // | |||||||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |||||||||
// See https://llvm.org/LICENSE.txt for license information. | // See https://llvm.org/LICENSE.txt for license information. | |||||||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |||||||||
// | // | |||||||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | |||||||||
// <memory> | // <memory> | |||||||||
// shared_ptr | // shared_ptr | |||||||||
// template<class T, class U> shared_ptr<T> const_pointer_cast(const shared_ptr<U>& r); | // template<class T, class U> shared_ptr<T> const_pointer_cast(const shared_ptr<U>& r) noexcept; | |||||||||
// template<class T, class U> shared_ptr<T> const_pointer_cast(shared_ptr<U>&& r) noexcept; | ||||||||||
Mordante: Please test whether this is really noexcept. There is a `ASSERT_NOEXCEPT` helper macro.
The… | ||||||||||
#include <cassert> | ||||||||||
#include <memory> | #include <memory> | |||||||||
#include <type_traits> | #include <type_traits> | |||||||||
#include <cassert> | #include <utility> | |||||||||
#include "test_macros.h" | #include "test_macros.h" | |||||||||
struct B | struct B | |||||||||
{ | { | |||||||||
static int count; | static int count; | |||||||||
B() {++count;} | B() {++count;} | |||||||||
Show All 14 Lines | ||||||||||
}; | }; | |||||||||
int A::count = 0; | int A::count = 0; | |||||||||
int main(int, char**) | int main(int, char**) | |||||||||
{ | { | |||||||||
{ | { | |||||||||
const std::shared_ptr<const A> pA(new A); | const std::shared_ptr<const A> pA(new A); | |||||||||
ASSERT_NOEXCEPT(std::const_pointer_cast<A>(pA)); | ||||||||||
std::shared_ptr<A> pB = std::const_pointer_cast<A>(pA); | std::shared_ptr<A> pB = std::const_pointer_cast<A>(pA); | |||||||||
assert(pB.get() == pA.get()); | assert(pB.get() == pA.get()); | |||||||||
assert(!pB.owner_before(pA) && !pA.owner_before(pB)); | assert(!pB.owner_before(pA) && !pA.owner_before(pB)); | |||||||||
} | } | |||||||||
{ | { | |||||||||
const std::shared_ptr<const A> pA; | const std::shared_ptr<const A> pA; | |||||||||
std::shared_ptr<A> pB = std::const_pointer_cast<A>(pA); | std::shared_ptr<A> pB = std::const_pointer_cast<A>(pA); | |||||||||
assert(pB.get() == pA.get()); | assert(pB.get() == pA.get()); | |||||||||
assert(!pB.owner_before(pA) && !pA.owner_before(pB)); | assert(!pB.owner_before(pA) && !pA.owner_before(pB)); | |||||||||
} | } | |||||||||
#if TEST_STD_VER > 14 | #if TEST_STD_VER > 14 | |||||||||
{ | { | |||||||||
const std::shared_ptr<const A[8]> pA; | const std::shared_ptr<const A[8]> pA; | |||||||||
std::shared_ptr<A[8]> pB = std::const_pointer_cast<A[8]>(pA); | std::shared_ptr<A[8]> pB = std::const_pointer_cast<A[8]>(pA); | |||||||||
assert(pB.get() == pA.get()); | assert(pB.get() == pA.get()); | |||||||||
assert(!pB.owner_before(pA) && !pA.owner_before(pB)); | assert(!pB.owner_before(pA) && !pA.owner_before(pB)); | |||||||||
} | } | |||||||||
#endif // TEST_STD_VER > 14 | #endif // TEST_STD_VER > 14 | |||||||||
#if TEST_STD_VER > 20 | ||||||||||
Or removed, the same for other tests. Mordante: Or removed, the same for other tests. | ||||||||||
philnikUnsubmitted
philnik: | ||||||||||
{ | ||||||||||
A* pA_raw = new A; | ||||||||||
std::shared_ptr<const A> pA(pA_raw); | ||||||||||
ASSERT_NOEXCEPT(std::const_pointer_cast<A>(std::move(pA))); | ||||||||||
std::shared_ptr<A> pB = std::const_pointer_cast<A>(std::move(pA)); | ||||||||||
assert(pA.get() == nullptr); | ||||||||||
assert(pB.get() == pA_raw); | ||||||||||
assert(pB.use_count() == 1); | ||||||||||
} | ||||||||||
#endif // TEST_STD_VER > 20 | ||||||||||
return 0; | return 0; | |||||||||
} | } |
Please test whether this is really noexcept. There is a ASSERT_NOEXCEPT helper macro.
The same for the other tests.