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