move_convert05.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//===----------------------------------------------------------------------===//
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//                     The LLVM Compiler Infrastructure
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This file is distributed under the University of Illinois Open Source
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// License. See LICENSE.TXT for details.
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//===----------------------------------------------------------------------===//
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// <memory>
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// unique_ptr
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test unique_ptr converting move ctor
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <memory>
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <cassert>
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "../../deleter.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// test converting move ctor.  Should only require a MoveConstructible deleter, or if
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//    deleter is a reference, not even that.
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Implicit version
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct A
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    static int count;
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    A() {++count;}
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    A(const A&) {++count;}
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual ~A() {--count;}
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint A::count = 0;
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct B
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : public A
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    static int count;
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    B() {++count;}
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    B(const B&) {++count;}
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual ~B() {--count;}
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint B::count = 0;
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint main()
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    {
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::unique_ptr<B, Deleter<B> > s(new B, Deleter<B>(5));
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    A* p = s.get();
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::unique_ptr<A, Deleter<A> > s2 = std::move(s);
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(s2.get() == p);
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(s.get() == 0);
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(A::count == 1);
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(B::count == 1);
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(s2.get_deleter().state() == 5);
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(s.get_deleter().state() == 0);
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(A::count == 0);
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(B::count == 0);
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch