1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // UNSUPPORTED: sanitizer-new-delete
14 // template <class Y, class D> explicit shared_ptr(unique_ptr<Y, D>&&r);
21 #include "test_macros.h"
22 #include "count_new.hpp"
29 B(const B&) {++count;}
30 virtual ~B() {--count;}
41 A(const A&) {++count;}
47 void fn ( const std::shared_ptr<int> &) {}
48 void fn ( const std::shared_ptr<B> &) { assert (false); }
51 void assert_deleter ( T * ) { assert(false); }
56 std::unique_ptr<A> ptr(new A);
57 A* raw_ptr = ptr.get();
58 std::shared_ptr<B> p(std::move(ptr));
59 assert(A::count == 1);
60 assert(B::count == 1);
61 assert(p.use_count() == 1);
62 assert(p.get() == raw_ptr);
63 assert(ptr.get() == 0);
65 #ifndef TEST_HAS_NO_EXCEPTIONS
66 assert(A::count == 0);
68 std::unique_ptr<A> ptr(new A);
69 A* raw_ptr = ptr.get();
70 globalMemCounter.throw_after = 0;
73 std::shared_ptr<B> p(std::move(ptr));
78 #if TEST_STD_VER >= 11
79 assert(A::count == 1);
80 assert(B::count == 1);
81 assert(ptr.get() == raw_ptr);
83 assert(A::count == 0);
84 assert(B::count == 0);
85 assert(ptr.get() == 0);
90 assert(A::count == 0);
92 fn(std::unique_ptr<int>(new int));
94 #if TEST_STD_VER >= 14
96 std::unique_ptr<int, void (*)(int*)> p(nullptr, assert_deleter<int>);
97 std::shared_ptr<int> p2(std::move(p)); // should not call deleter when going out of scope