move_convert04.pass.cpp revision c52f43e72dfcea03037729649da84c23b3beb04a
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//===----------------------------------------------------------------------===//
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//                     The LLVM Compiler Infrastructure
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// This file is distributed under the University of Illinois Open Source
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// License. See LICENSE.TXT for details.
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//===----------------------------------------------------------------------===//
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// <memory>
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// unique_ptr
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Test unique_ptr converting move ctor
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <memory>
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <cassert>
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// test converting move ctor.  Should only require a MoveConstructible deleter, or if
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//    deleter is a reference, not even that.
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// implicit version
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct A
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static int count;
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    A() {++count;}
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    A(const A&) {++count;}
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual ~A() {--count;}
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint A::count = 0;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct B
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    : public A
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static int count;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    B() {++count;}
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    B(const B&) {++count;}
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual ~B() {--count;}
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint B::count = 0;
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint main()
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    std::unique_ptr<B> s(new B);
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    A* p = s.get();
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    std::unique_ptr<A> s2 = std::move(s);
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    assert(s2.get() == p);
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    assert(s.get() == 0);
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    assert(A::count == 1);
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    assert(B::count == 1);
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    assert(A::count == 0);
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    assert(B::count == 0);
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov