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 // Test unique_ptr move ctor 15 16 // test move ctor. Should only require a MoveConstructible deleter, or if 17 // deleter is a reference, not even that. 18 19 #include <memory> 20 #include <cassert> 21 22 #include "../../deleter.h" 23 24 struct A 25 { 26 static int count; 27 A() {++count;} 28 A(const A&) {++count;} 29 ~A() {--count;} 30 }; 31 32 int A::count = 0; 33 34 class NCDeleter 35 { 36 int state_; 37 38 NCDeleter(NCDeleter&); 39 NCDeleter& operator=(NCDeleter&); 40 public: 41 42 NCDeleter() : state_(5) {} 43 44 int state() const {return state_;} 45 void set_state(int s) {state_ = s;} 46 47 void operator()(A* p) {delete [] p;} 48 }; 49 50 std::unique_ptr<A[]> 51 source1() 52 { 53 return std::unique_ptr<A[]>(new A[3]); 54 } 55 56 void sink1(std::unique_ptr<A[]> p) 57 { 58 } 59 60 std::unique_ptr<A[], Deleter<A[]> > 61 source2() 62 { 63 return std::unique_ptr<A[], Deleter<A[]> >(new A[3]); 64 } 65 66 void sink2(std::unique_ptr<A[], Deleter<A[]> > p) 67 { 68 } 69 70 std::unique_ptr<A[], NCDeleter&> 71 source3() 72 { 73 static NCDeleter d; 74 return std::unique_ptr<A[], NCDeleter&>(new A[3], d); 75 } 76 77 void sink3(std::unique_ptr<A[], NCDeleter&> p) 78 { 79 } 80 81 int main() 82 { 83 sink1(source1()); 84 sink2(source2()); 85 sink3(source3()); 86 assert(A::count == 0); 87 } 88