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 Y> shared_ptr& operator=(auto_ptr<Y>&& r);
14 
15 // REQUIRES: c++03 || c++11 || c++14
16 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
17 
18 #include <memory>
19 #include <type_traits>
20 #include <cassert>
21 
22 #include "test_macros.h"
23 
24 struct B
25 {
26     static int count;
27 
BB28     B() {++count;}
BB29     B(const B&) {++count;}
~BB30     virtual ~B() {--count;}
31 };
32 
33 int B::count = 0;
34 
35 struct A
36     : public B
37 {
38     static int count;
39 
AA40     A() {++count;}
AA41     A(const A& other) : B(other) {++count;}
~AA42     ~A() {--count;}
43 };
44 
45 int A::count = 0;
46 
main(int,char **)47 int main(int, char**)
48 {
49     {
50         std::auto_ptr<A> pA(new A);
51         A* ptrA = pA.get();
52         {
53             std::shared_ptr<B> pB(new B);
54             pB = std::move(pA);
55             assert(B::count == 1);
56             assert(A::count == 1);
57             assert(pB.use_count() == 1);
58             assert(pA.get() == 0);
59             assert(pB.get() == ptrA);
60         }
61         assert(B::count == 0);
62         assert(A::count == 0);
63     }
64     assert(B::count == 0);
65     assert(A::count == 0);
66     {
67         std::auto_ptr<A> pA;
68         A* ptrA = pA.get();
69         {
70             std::shared_ptr<B> pB(new B);
71             pB = std::move(pA);
72             assert(B::count == 0);
73             assert(A::count == 0);
74             assert(pB.use_count() == 1);
75             assert(pA.get() == 0);
76             assert(pB.get() == ptrA);
77         }
78         assert(B::count == 0);
79         assert(A::count == 0);
80     }
81     assert(B::count == 0);
82     assert(A::count == 0);
83     {
84         std::auto_ptr<A> pA(new A);
85         A* ptrA = pA.get();
86         {
87             std::shared_ptr<B> pB;
88             pB = std::move(pA);
89             assert(B::count == 1);
90             assert(A::count == 1);
91             assert(pB.use_count() == 1);
92             assert(pA.get() == 0);
93             assert(pB.get() == ptrA);
94         }
95         assert(B::count == 0);
96         assert(A::count == 0);
97     }
98     assert(B::count == 0);
99     assert(A::count == 0);
100     {
101         std::auto_ptr<A> pA;
102         A* ptrA = pA.get();
103         {
104             std::shared_ptr<B> pB;
105             pB = std::move(pA);
106             assert(B::count == 0);
107             assert(A::count == 0);
108             assert(pB.use_count() == 1);
109             assert(pA.get() == 0);
110             assert(pB.get() == ptrA);
111         }
112         assert(B::count == 0);
113         assert(A::count == 0);
114     }
115     assert(B::count == 0);
116     assert(A::count == 0);
117 
118   return 0;
119 }
120