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/dynamic_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/dynamic_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> dynamic_pointer_cast(const shared_ptr<U>& r); | // template<class T, class U> shared_ptr<T> dynamic_pointer_cast(const shared_ptr<U>& r) noexcept; | ||||
// template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U>&& r) noexcept; | |||||
// UNSUPPORTED: no-rtti | // UNSUPPORTED: no-rtti | ||||
#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<B> pB(new A); | const std::shared_ptr<B> pB(new A); | ||||
ASSERT_NOEXCEPT(std::dynamic_pointer_cast<A>(pB)); | |||||
std::shared_ptr<A> pA = std::dynamic_pointer_cast<A>(pB); | std::shared_ptr<A> pA = std::dynamic_pointer_cast<A>(pB); | ||||
assert(pA.get() == pB.get()); | assert(pA.get() == pB.get()); | ||||
assert(!pB.owner_before(pA) && !pA.owner_before(pB)); | assert(!pB.owner_before(pA) && !pA.owner_before(pB)); | ||||
} | } | ||||
{ | { | ||||
const std::shared_ptr<B> pB(new B); | const std::shared_ptr<B> pB(new B); | ||||
std::shared_ptr<A> pA = std::dynamic_pointer_cast<A>(pB); | std::shared_ptr<A> pA = std::dynamic_pointer_cast<A>(pB); | ||||
assert(pA.get() == 0); | assert(pA.get() == 0); | ||||
assert(pA.use_count() == 0); | assert(pA.use_count() == 0); | ||||
} | } | ||||
#if TEST_STD_VER > 14 | #if TEST_STD_VER > 14 | ||||
{ | { | ||||
const std::shared_ptr<B[8]> pB(new B[8]); | const std::shared_ptr<B[8]> pB(new B[8]); | ||||
std::shared_ptr<A[8]> pA = std::dynamic_pointer_cast<A[8]>(pB); | std::shared_ptr<A[8]> pA = std::dynamic_pointer_cast<A[8]>(pB); | ||||
assert(pA.get() == 0); | assert(pA.get() == 0); | ||||
assert(pA.use_count() == 0); | assert(pA.use_count() == 0); | ||||
} | } | ||||
#endif // TEST_STD_VER > 14 | #endif // TEST_STD_VER > 14 | ||||
#if TEST_STD_VER > 20 | |||||
{ | |||||
A* pA_raw = new A; | |||||
std::shared_ptr<B> pB(pA_raw); | |||||
ASSERT_NOEXCEPT(std::dynamic_pointer_cast<A>(std::move(pB))); | |||||
std::shared_ptr<A> pA = std::dynamic_pointer_cast<A>(std::move(pB)); | |||||
assert(pB.get() == nullptr); | |||||
assert(pA.get() == pA_raw); | |||||
assert(pA.use_count() == 1); | |||||
} | |||||
#endif // TEST_STD_VER > 20 | |||||
return 0; | return 0; | ||||
} | } |