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