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)