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