move_convert06.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Source Licenses. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <memory> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unique_ptr 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test unique_ptr converting move ctor 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <memory> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test converting move ctor. Should only require a MoveConstructible deleter, or if 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// deleter is a reference, not even that. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Explicit version 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct A 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int count; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A() {++count;} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A(const A&) {++count;} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~A() {--count;} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int A::count = 0; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct B 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public A 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int count; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B() {++count;} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) B(const B&) {++count;} 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~B() {--count;} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochint B::count = 0; 43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template <class T> 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CDeleter 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int state_; 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CDeleter(CDeleter&); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CDeleter& operator=(CDeleter&); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CDeleter() : state_(5) {} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state() const {return state_;} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_state(int s) {state_ = s;} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void operator()(T* p) {delete p;} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main() 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CDeleter<A> d; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::unique_ptr<B, CDeleter<A>&> s(new B, d); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A* p = s.get(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::unique_ptr<A, CDeleter<A>&> s2 = std::move(s); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(s2.get() == p); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(s.get() == 0); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(A::count == 1); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(B::count == 1); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_state(6); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(s2.get_deleter().state() == d.state()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(s.get_deleter().state() == d.state()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(A::count == 0); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(B::count == 0); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)