1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <memory>
11 
12 // unique_ptr
13 
14 //=============================================================================
15 // TESTING std::unique_ptr::unique_ptr()
16 //
17 // Concerns:
18 //   1 The default constructor works for any default constructible deleter types.
19 //   2 The stored type 'T' is allowed to be incomplete.
20 //
21 // Plan
22 //  1 Default construct unique_ptr's with various deleter types (C-1)
23 //  2 Default construct a unique_ptr with a incomplete element_type and
24 //    various deleter types (C-1,2)
25 
26 #include <memory>
27 #include <cassert>
28 
29 #include "../../deleter.h"
30 
31 struct IncompleteT;
32 
33 void checkNumIncompleteTypeAlive(int i);
34 
35 template <class Del = std::default_delete<IncompleteT> >
36 struct StoresIncomplete {
37   std::unique_ptr<IncompleteT, Del> m_ptr;
StoresIncompleteStoresIncomplete38   StoresIncomplete() {}
39   ~StoresIncomplete();
40 
getStoresIncomplete41   IncompleteT* get() const { return m_ptr.get(); }
get_deleterStoresIncomplete42   Del& get_deleter() { return m_ptr.get_deleter(); }
43 };
44 
main()45 int main()
46 {
47     {
48       std::unique_ptr<int> p;
49       assert(p.get() == 0);
50     }
51     {
52       std::unique_ptr<int, NCDeleter<int> > p;
53       assert(p.get() == 0);
54       assert(p.get_deleter().state() == 0);
55       p.get_deleter().set_state(5);
56       assert(p.get_deleter().state() == 5);
57     }
58     {
59         StoresIncomplete<> s;
60         assert(s.get() == 0);
61         checkNumIncompleteTypeAlive(0);
62     }
63     checkNumIncompleteTypeAlive(0);
64     {
65         StoresIncomplete< Deleter<IncompleteT> > s;
66         assert(s.get() == 0);
67         assert(s.get_deleter().state() == 0);
68         checkNumIncompleteTypeAlive(0);
69     }
70     checkNumIncompleteTypeAlive(0);
71 }
72 
73 struct IncompleteT {
74     static int count;
IncompleteTIncompleteT75     IncompleteT() { ++count; }
~IncompleteTIncompleteT76     ~IncompleteT() {--count; }
77 };
78 
79 int IncompleteT::count = 0;
80 
checkNumIncompleteTypeAlive(int i)81 void checkNumIncompleteTypeAlive(int i) {
82     assert(IncompleteT::count == i);
83 }
84 
85 template <class Del>
~StoresIncomplete()86 StoresIncomplete<Del>::~StoresIncomplete() { }