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 // UNSUPPORTED: c++03, c++11, c++14
11
12 // template<class T> class shared_ptr
13
14 // shared_ptr(weak_ptr<T>) -> shared_ptr<T>
15 // shared_ptr(unique_ptr<T>) -> shared_ptr<T>
16
17 #include <memory>
18 #include <cassert>
19
20 #include "test_macros.h"
21
22 struct A {};
23
24 struct D {
operator ()D25 void operator()(A const* ptr) const
26 {
27 delete ptr;
28 }
29 };
30
main(int,char **)31 int main(int, char**)
32 {
33 {
34 std::shared_ptr<A> s0(new A);
35 std::weak_ptr<A> w = s0;
36 auto s = std::shared_ptr(w);
37 ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);
38 assert(s0.use_count() == 2);
39 assert(s.use_count() == 2);
40 assert(s0.get() == s.get());
41 }
42 {
43 std::shared_ptr<A const> s0(new A);
44 std::weak_ptr<A const> w = s0;
45 auto s = std::shared_ptr(w);
46 ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);
47 assert(s0.use_count() == 2);
48 assert(s.use_count() == 2);
49 assert(s0.get() == s.get());
50 }
51
52 {
53 std::unique_ptr<A> u(new A);
54 A* uPointee = u.get();
55 std::shared_ptr s = std::move(u);
56 ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);
57 assert(u == nullptr);
58 assert(s.get() == uPointee);
59 }
60 {
61 std::unique_ptr<A const> u(new A);
62 A const* uPointee = u.get();
63 std::shared_ptr s = std::move(u);
64 ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);
65 assert(u == nullptr);
66 assert(s.get() == uPointee);
67 }
68
69 {
70 std::unique_ptr<A, D> u(new A, D{});
71 A* uPointee = u.get();
72 std::shared_ptr s(std::move(u));
73 ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);
74 assert(u == nullptr);
75 assert(s.get() == uPointee);
76 }
77 {
78 std::unique_ptr<A const, D> u(new A, D{});
79 A const* uPointee = u.get();
80 std::shared_ptr s(std::move(u));
81 ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);
82 assert(u == nullptr);
83 assert(s.get() == uPointee);
84 }
85
86 return 0;
87 }
88