move02.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
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 24struct A 25{ 26 static int count; 27 A() {++count;} 28 A(const A&) {++count;} 29 ~A() {--count;} 30}; 31 32int A::count = 0; 33 34class NCDeleter 35{ 36 int state_; 37 38 NCDeleter(NCDeleter&); 39 NCDeleter& operator=(NCDeleter&); 40public: 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 50std::unique_ptr<A[]> 51source1() 52{ 53 return std::unique_ptr<A[]>(new A[3]); 54} 55 56void sink1(std::unique_ptr<A[]> p) 57{ 58} 59 60std::unique_ptr<A[], Deleter<A[]> > 61source2() 62{ 63 return std::unique_ptr<A[], Deleter<A[]> >(new A[3]); 64} 65 66void sink2(std::unique_ptr<A[], Deleter<A[]> > p) 67{ 68} 69 70std::unique_ptr<A[], NCDeleter&> 71source3() 72{ 73 static NCDeleter d; 74 return std::unique_ptr<A[], NCDeleter&>(new A[3], d); 75} 76 77void sink3(std::unique_ptr<A[], NCDeleter&> p) 78{ 79} 80 81int main() 82{ 83 sink1(source1()); 84 sink2(source2()); 85 sink3(source3()); 86 assert(A::count == 0); 87} 88