1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <memory>
10 
11 // shared_ptr
12 
13 // template<class T, class U>
14 //     shared_ptr<T> reinterpret_pointer_cast(const shared_ptr<U>& r) noexcept;
15 
16 #include "test_macros.h"
17 
18 #include <memory>
19 #include <type_traits>
20 #include <cassert>
21 
22 struct A {
23   int x;
24 };
25 
26 struct Base { };
27 struct Derived : public Base { };
28 
main(int,char **)29 int main(int, char**) {
30   {
31     const std::shared_ptr<A> pA(new A);
32     std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA);
33     std::shared_ptr<A> pA2 = std::reinterpret_pointer_cast<A>(pi);
34     assert(pA2.get() == pA.get());
35     assert(!pi.owner_before(pA) && !pA.owner_before(pi));
36   }
37   {
38     const std::shared_ptr<A> pA;
39     std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA);
40     std::shared_ptr<A> pA2 = std::reinterpret_pointer_cast<A>(pi);
41     assert(pA2.get() == pA.get());
42     assert(!pi.owner_before(pA) && !pA.owner_before(pi));
43   }
44   {
45     const std::shared_ptr<A> pA(new A);
46     std::shared_ptr<int> pi = std::reinterpret_pointer_cast<int>(pA);
47     pA->x = 42;
48     assert(*pi == 42);
49   }
50   {
51     const std::shared_ptr<Derived> pDerived(new Derived);
52     std::shared_ptr<Base> pBase = std::reinterpret_pointer_cast<Base>(pDerived);
53     std::shared_ptr<Derived> pDerived2 = std::reinterpret_pointer_cast<Derived>(pBase);
54     assert(pDerived2.get() == pDerived2.get());
55     assert(!pBase.owner_before(pDerived) && !pDerived.owner_before(pBase));
56   }
57   {
58     const std::shared_ptr<Base> pBase(new Base);
59     std::shared_ptr<Derived> pDerived = std::reinterpret_pointer_cast<Derived>(pBase);
60     std::shared_ptr<Base> pBase2 = std::reinterpret_pointer_cast<Base>(pDerived);
61     assert(pBase2.get() == pBase.get());
62     assert(!pDerived.owner_before(pBase) && !pBase.owner_before(pDerived));
63   }
64 #if TEST_STD_VER > 14
65   {
66     const std::shared_ptr<A[8]> pA;
67     std::shared_ptr<int[8]> pi = std::reinterpret_pointer_cast<int[8]>(pA);
68     std::shared_ptr<A[8]> pA2 = std::reinterpret_pointer_cast<A[8]>(pi);
69     assert(pA2.get() == pA.get());
70     assert(!pi.owner_before(pA) && !pA.owner_before(pi));
71   }
72 #endif // TEST_STD_VER > 14
73 
74   return 0;
75 }
76