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/reinterpret_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/reinterpret_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> | // template<class T, class U> | ||||
// shared_ptr<T> reinterpret_pointer_cast(const shared_ptr<U>& r) noexcept; | // shared_ptr<T> reinterpret_pointer_cast(const shared_ptr<U>& r) noexcept; | ||||
// template<class T, class U> | |||||
// shared_ptr<T> reinterpret_pointer_cast(shared_ptr<U>&& r) noexcept; | |||||
#include "test_macros.h" | #include "test_macros.h" | ||||
#include <cassert> | |||||
#include <memory> | #include <memory> | ||||
#include <type_traits> | #include <type_traits> | ||||
#include <cassert> | #include <utility> | ||||
struct A { | struct A { | ||||
int x; | int x; | ||||
}; | }; | ||||
struct Base { }; | struct Base { }; | ||||
struct Derived : public Base { }; | struct Derived : public Base { }; | ||||
int main(int, char**) { | int main(int, char**) { | ||||
{ | { | ||||
const std::shared_ptr<A> pA(new A); | const std::shared_ptr<A> pA(new A); | ||||
ASSERT_NOEXCEPT(std::reinterpret_pointer_cast<int>(pA)); | |||||
std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA); | std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA); | ||||
std::shared_ptr<A> pA2 = std::reinterpret_pointer_cast<A>(pi); | std::shared_ptr<A> pA2 = std::reinterpret_pointer_cast<A>(pi); | ||||
assert(pA2.get() == pA.get()); | assert(pA2.get() == pA.get()); | ||||
assert(!pi.owner_before(pA) && !pA.owner_before(pi)); | assert(!pi.owner_before(pA) && !pA.owner_before(pi)); | ||||
} | } | ||||
{ | { | ||||
const std::shared_ptr<A> pA; | const std::shared_ptr<A> pA; | ||||
std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA); | std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA); | ||||
Show All 25 Lines | #if TEST_STD_VER > 14 | ||||
{ | { | ||||
const std::shared_ptr<A[8]> pA; | const std::shared_ptr<A[8]> pA; | ||||
std::shared_ptr<int[8]> pi = std::reinterpret_pointer_cast<int[8]>(pA); | std::shared_ptr<int[8]> pi = std::reinterpret_pointer_cast<int[8]>(pA); | ||||
std::shared_ptr<A[8]> pA2 = std::reinterpret_pointer_cast<A[8]>(pi); | std::shared_ptr<A[8]> pA2 = std::reinterpret_pointer_cast<A[8]>(pi); | ||||
assert(pA2.get() == pA.get()); | assert(pA2.get() == pA.get()); | ||||
assert(!pi.owner_before(pA) && !pA.owner_before(pi)); | assert(!pi.owner_before(pA) && !pA.owner_before(pi)); | ||||
} | } | ||||
#endif // TEST_STD_VER > 14 | #endif // TEST_STD_VER > 14 | ||||
#if TEST_STD_VER > 20 | |||||
{ | |||||
A* pA_raw = new A; | |||||
std::shared_ptr<A> pA(pA_raw); | |||||
ASSERT_NOEXCEPT(std::reinterpret_pointer_cast<int>(std::move(pA))); | |||||
std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(std::move(pA)); | |||||
assert(pA.get() == nullptr); | |||||
assert(pi.use_count() == 1); | |||||
std::shared_ptr<A> pA2 = std::reinterpret_pointer_cast<A>(std::move(pi)); | |||||
assert(pi.get() == nullptr); | |||||
assert(pA2.get() == pA_raw); | |||||
assert(pA2.use_count() == 1); | |||||
} | |||||
#endif // TEST_STD_VER > 20 | |||||
return 0; | return 0; | ||||
} | } |