move_convert05.fail.cpp revision c52f43e72dfcea03037729649da84c23b3beb04a
180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//===----------------------------------------------------------------------===// 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// The LLVM Compiler Infrastructure 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// This file is distributed under the University of Illinois Open Source 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// License. See LICENSE.TXT for details. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//===----------------------------------------------------------------------===// 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// <memory> 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// unique_ptr 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Test unique_ptr converting move ctor 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// test converting move ctor. Should only require a MoveConstructible deleter, or if 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// deleter is a reference, not even that. 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Implicit version 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <memory> 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <cassert> 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "../../deleter.h" 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct A 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static int count; 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru A() {++count;} 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru A(const A&) {++count;} 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~A() {--count;} 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint A::count = 0; 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct B 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : public A 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static int count; 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru B() {++count;} 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru B(const B&) {++count;} 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~B() {--count;} 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint B::count = 0; 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint main() 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru std::unique_ptr<B[], Deleter<B[]> > s(new B); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru A* p = s.get(); 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru std::unique_ptr<A[], Deleter<A[]> > s2 = s; 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru assert(s2.get() == p); 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru assert(s.get() == 0); 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru assert(A::count == 1); 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru assert(B::count == 1); 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger assert(s2.get_deleter().state() == 5); 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger assert(s.get_deleter().state() == 0); 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger assert(A::count == 0); 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger assert(B::count == 0); 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru