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 // UNSUPPORTED: c++03 10 11 // <memory> 12 13 // shared_ptr 14 15 // shared_ptr& operator=(shared_ptr&& r); 16 17 #include <memory> 18 #include <type_traits> 19 #include <cassert> 20 #include <utility> 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 **)47int main(int, char**) 48 { 49 { 50 std::shared_ptr<A> pA(new A); 51 A* ptrA = pA.get(); 52 { 53 std::shared_ptr<A> pB(new A); 54 pB = std::move(pA); 55 assert(B::count == 1); 56 assert(A::count == 1); 57 assert(pB.use_count() == 1); 58 assert(pA.use_count() == 0); 59 assert(pA.get() == 0); 60 assert(pB.get() == ptrA); 61 } 62 assert(pA.use_count() == 0); 63 assert(B::count == 0); 64 assert(A::count == 0); 65 } 66 assert(B::count == 0); 67 assert(A::count == 0); 68 { 69 std::shared_ptr<A> pA; 70 A* ptrA = pA.get(); 71 { 72 std::shared_ptr<A> pB(new A); 73 pB = std::move(pA); 74 assert(B::count == 0); 75 assert(A::count == 0); 76 assert(pB.use_count() == 0); 77 assert(pA.use_count() == 0); 78 assert(pA.get() == 0); 79 assert(pB.get() == ptrA); 80 } 81 assert(pA.use_count() == 0); 82 assert(B::count == 0); 83 assert(A::count == 0); 84 } 85 assert(B::count == 0); 86 assert(A::count == 0); 87 { 88 std::shared_ptr<A> pA(new A); 89 A* ptrA = pA.get(); 90 { 91 std::shared_ptr<A> pB; 92 pB = std::move(pA); 93 assert(B::count == 1); 94 assert(A::count == 1); 95 assert(pB.use_count() == 1); 96 assert(pA.use_count() == 0); 97 assert(pA.get() == 0); 98 assert(pB.get() == ptrA); 99 } 100 assert(pA.use_count() == 0); 101 assert(B::count == 0); 102 assert(A::count == 0); 103 } 104 assert(B::count == 0); 105 assert(A::count == 0); 106 { 107 std::shared_ptr<A> pA; 108 A* ptrA = pA.get(); 109 { 110 std::shared_ptr<A> pB; 111 pB = std::move(pA); 112 assert(B::count == 0); 113 assert(A::count == 0); 114 assert(pB.use_count() == 0); 115 assert(pA.use_count() == 0); 116 assert(pA.get() == 0); 117 assert(pB.get() == ptrA); 118 } 119 assert(pA.use_count() == 0); 120 assert(B::count == 0); 121 assert(A::count == 0); 122 } 123 assert(B::count == 0); 124 assert(A::count == 0); 125 126 return 0; 127 } 128