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