Home | History | Annotate | Download | only in unique.ptr.runtime.ctor
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <memory>
     11 
     12 // unique_ptr
     13 
     14 // Test unique_ptr move ctor
     15 
     16 // test move ctor.  Should only require a MoveConstructible deleter, or if
     17 //    deleter is a reference, not even that.
     18 
     19 #include <memory>
     20 #include <cassert>
     21 
     22 #include "../../deleter.h"
     23 
     24 struct A
     25 {
     26     static int count;
     27     A() {++count;}
     28     A(const A&) {++count;}
     29     ~A() {--count;}
     30 };
     31 
     32 int A::count = 0;
     33 
     34 class NCDeleter
     35 {
     36     int state_;
     37 
     38     NCDeleter(NCDeleter&);
     39     NCDeleter& operator=(NCDeleter&);
     40 public:
     41 
     42     NCDeleter() : state_(5) {}
     43 
     44     int state() const {return state_;}
     45     void set_state(int s) {state_ = s;}
     46 
     47     void operator()(A* p) {delete [] p;}
     48 };
     49 
     50 std::unique_ptr<A[]>
     51 source1()
     52 {
     53     return std::unique_ptr<A[]>(new A[3]);
     54 }
     55 
     56 void sink1(std::unique_ptr<A[]> p)
     57 {
     58 }
     59 
     60 std::unique_ptr<A[], Deleter<A[]> >
     61 source2()
     62 {
     63     return std::unique_ptr<A[], Deleter<A[]> >(new A[3]);
     64 }
     65 
     66 void sink2(std::unique_ptr<A[], Deleter<A[]> > p)
     67 {
     68 }
     69 
     70 std::unique_ptr<A[], NCDeleter&>
     71 source3()
     72 {
     73     static NCDeleter d;
     74     return std::unique_ptr<A[], NCDeleter&>(new A[3], d);
     75 }
     76 
     77 void sink3(std::unique_ptr<A[], NCDeleter&> p)
     78 {
     79 }
     80 
     81 int main()
     82 {
     83     sink1(source1());
     84     sink2(source2());
     85     sink3(source3());
     86     assert(A::count == 0);
     87 }
     88