move_convert06.fail.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Source Licenses. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// <memory> 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unique_ptr 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test unique_ptr converting move ctor 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test converting move ctor. Should only require a MoveConstructible deleter, or if 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// deleter is a reference, not even that. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Explicit version 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <memory> 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <cassert> 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct A 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int count; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A() {++count;} 27 A(const A&) {++count;} 28 virtual ~A() {--count;} 29}; 30 31int A::count = 0; 32 33struct B 34 : public A 35{ 36 static int count; 37 B() {++count;} 38 B(const B&) {++count;} 39 virtual ~B() {--count;} 40}; 41 42int B::count = 0; 43 44template <class T> 45class CDeleter 46{ 47 int state_; 48 49 CDeleter(CDeleter&); 50 CDeleter& operator=(CDeleter&); 51public: 52 53 CDeleter() : state_(5) {} 54 55 int state() const {return state_;} 56 void set_state(int s) {state_ = s;} 57 58 void operator()(T* p) {delete p;} 59}; 60 61int main() 62{ 63 { 64 CDeleter<A> d; 65 std::unique_ptr<B[], CDeleter<A>&> s(new B, d); 66 A* p = s.get(); 67 std::unique_ptr<A[], CDeleter<A>&> s2 = s; 68 assert(s2.get() == p); 69 assert(s.get() == 0); 70 assert(A::count == 1); 71 assert(B::count == 1); 72 d.set_state(6); 73 assert(s2.get_deleter().state() == d.state()); 74 assert(s.get_deleter().state() == d.state()); 75 } 76 assert(A::count == 0); 77 assert(B::count == 0); 78} 79