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 // template<class Y> explicit shared_ptr(auto_ptr<Y>&& r); 12 13 // REQUIRES: c++03 || c++11 || c++14 14 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS 15 16 #include <memory> 17 #include <new> 18 #include <cstdlib> 19 #include <cassert> 20 21 #include "test_macros.h" 22 #include "count_new.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 globalMemCounter.reset(); 50 { 51 std::auto_ptr<A> ptr(new A); 52 A* raw_ptr = ptr.get(); 53 std::shared_ptr<B> p(std::move(ptr)); 54 assert(A::count == 1); 55 assert(B::count == 1); 56 assert(p.use_count() == 1); 57 assert(p.get() == raw_ptr); 58 assert(ptr.get() == 0); 59 } 60 assert(A::count == 0); 61 assert(globalMemCounter.checkOutstandingNewEq(0)); 62 63 globalMemCounter.reset(); 64 { 65 std::auto_ptr<A const> ptr(new A); 66 A const* raw_ptr = ptr.get(); 67 std::shared_ptr<B const> p(std::move(ptr)); 68 assert(A::count == 1); 69 assert(B::count == 1); 70 assert(p.use_count() == 1); 71 assert(p.get() == raw_ptr); 72 assert(ptr.get() == 0); 73 } 74 assert(A::count == 0); 75 assert(globalMemCounter.checkOutstandingNewEq(0)); 76 77 #if !defined(TEST_HAS_NO_EXCEPTIONS) && !defined(DISABLE_NEW_COUNT) 78 { 79 std::auto_ptr<A> ptr(new A); 80 A* raw_ptr = ptr.get(); 81 globalMemCounter.throw_after = 0; 82 try 83 { 84 std::shared_ptr<B> p(std::move(ptr)); 85 assert(false); 86 } 87 catch (...) 88 { 89 assert(A::count == 1); 90 assert(B::count == 1); 91 assert(ptr.get() == raw_ptr); 92 } 93 } 94 assert(A::count == 0); 95 assert(globalMemCounter.checkOutstandingNewEq(0)); 96 #endif // !defined(TEST_HAS_NO_EXCEPTIONS) && !defined(DISABLE_NEW_COUNT) 97 98 return 0; 99 } 100