move_convert03.pass.cpp revision bc8d3f97eb5c958007f2713238472e0c1c8fe02c
1995e26b0523ac8e3b6199a509b871b81fa5df6eeNick Lewycky//===----------------------------------------------------------------------===// 27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// ��������������������The LLVM Compiler Infrastructure 47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source 67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details. 77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <memory> 117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// unique_ptr 137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Test unique_ptr converting move assignment 157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// test converting move assignment with reference deleters 177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include <memory> 197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include <cassert> 207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "../../deleter.h" 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistruct A 247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei{ 256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static int count; 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei A() {++count;} 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei A(const A&) {++count;} 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei virtual ~A() {--count;} 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint A::count = 0; 327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct B 347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : public A 357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei{ 367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static int count; 377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei B() {++count;} 387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei B(const B&) {++count;} 397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei virtual ~B() {--count;} 407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint B::count = 0; 431a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiint main() 457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei{ 46ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis { 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CDeleter<B> db(5); 487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::unique_ptr<B, CDeleter<B>&> s(new B, db); 497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei A* p = s.get(); 507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CDeleter<A> da(6); 517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::unique_ptr<A, CDeleter<A>&> s2(new A, da); 527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei s2 = std::move(s); 537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(s2.get() == p); 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(s.get() == 0); 557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(A::count == 1); 56e4e4a88eb67ce1cd32a5761f0601fc029d68832bChris Lattner assert(B::count == 1); 577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(s.get_deleter().state() == 5); 58ef8225444452a1486bd721f3285301fe84643b00Stephen Hines assert(s2.get_deleter().state() == 5); 597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(A::count == 0); 617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(B::count == 0); 627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 638f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner