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 //===----------------------------------------------------------------------===//
14 //=============================================================================
15 // TESTING std::unique_ptr::unique_ptr()
18 // 1 The pointer constructor works for any default constructible deleter types.
19 // 2 The pointer constructor accepts pointers to derived types.
20 // 2 The stored type 'T' is allowed to be incomplete.
23 // 1 Construct unique_ptr<T, D>'s with a pointer to 'T' and various deleter
25 // 2 Construct unique_ptr<T, D>'s with a pointer to 'D' and various deleter
26 // types where 'D' is derived from 'T'. (C-1,2)
27 // 3 Construct a unique_ptr<T, D> with a pointer to 'T' and various deleter
28 // types where 'T' is an incomplete type (C-1,3)
30 // Test unique_ptr(pointer) ctor
35 #include "../../deleter.h"
37 // unique_ptr(pointer) ctor should only require default Deleter ctor
43 A(const A&) {++count;}
44 virtual ~A() {--count;}
55 B(const B&) {++count;}
56 virtual ~B() {--count;}
64 IncompleteT* getIncomplete();
65 void checkNumIncompleteTypeAlive(int i);
67 template <class Del = std::default_delete<IncompleteT> >
68 struct StoresIncomplete {
69 std::unique_ptr<IncompleteT, Del> m_ptr;
71 explicit StoresIncomplete(IncompleteT* ptr) : m_ptr(ptr) {}
74 IncompleteT* get() const { return m_ptr.get(); }
75 Del& get_deleter() { return m_ptr.get_deleter(); }
82 assert(A::count == 1);
83 std::unique_ptr<A> s(p);
86 assert(A::count == 0);
89 assert(A::count == 1);
90 std::unique_ptr<A, NCDeleter<A> > s(p);
92 assert(s.get_deleter().state() == 0);
94 assert(A::count == 0);
101 assert(A::count == 1);
102 assert(B::count == 1);
103 std::unique_ptr<A> s(p);
104 assert(s.get() == p);
106 assert(A::count == 0);
107 assert(B::count == 0);
110 assert(A::count == 1);
111 assert(B::count == 1);
112 std::unique_ptr<A, NCDeleter<A> > s(p);
113 assert(s.get() == p);
114 assert(s.get_deleter().state() == 0);
116 assert(A::count == 0);
117 assert(B::count == 0);
120 void test_incomplete()
123 IncompleteT* p = getIncomplete();
124 checkNumIncompleteTypeAlive(1);
125 StoresIncomplete<> s(p);
126 assert(s.get() == p);
128 checkNumIncompleteTypeAlive(0);
130 IncompleteT* p = getIncomplete();
131 checkNumIncompleteTypeAlive(1);
132 StoresIncomplete< NCDeleter<IncompleteT> > s(p);
133 assert(s.get() == p);
134 assert(s.get_deleter().state() == 0);
136 checkNumIncompleteTypeAlive(0);
141 IncompleteT() { ++count; }
142 ~IncompleteT() {--count; }
145 int IncompleteT::count = 0;
147 IncompleteT* getIncomplete() {
148 return new IncompleteT;
151 void checkNumIncompleteTypeAlive(int i) {
152 assert(IncompleteT::count == i);
156 StoresIncomplete<Del>::~StoresIncomplete() { }