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