pointer02.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===----------------------------------------------------------------------===//
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// <memory>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// unique_ptr
13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Test unique_ptr<T[]>(pointer) ctor
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// unique_ptr<T[]>(pointer) ctor shouldn't require complete type
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <memory>
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cassert>
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct A;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Deleter
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int state_;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Deleter(Deleter&);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Deleter& operator=(Deleter&);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Deleter() : state_(5) {}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int state() const {return state_;}
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void operator()(A* p);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void check(int i);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)template <class D = std::default_delete<A[]> >
41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)struct B
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::unique_ptr<A[], D> a_;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit B(A*);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~B();
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    A* get() const {return a_.get();}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    D& get_deleter() {return a_.get_deleter();}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)A* get();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int main()
54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles){
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    A* p = get();
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    check(3);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    B<> s(p);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    assert(s.get() == p);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    check(0);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    A* p = get();
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    check(3);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    B<Deleter> s(p);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(s.get() == p);
67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    assert(s.get_deleter().state() == 5);
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    check(0);
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct A
73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles){
74b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    static int count;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    A() {++count;}
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    A(const A&) {++count;}
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ~A() {--count;}
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int A::count = 0;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)A* get() {return new A[3];}
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Deleter::operator()(A* p) {delete [] p;}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void check(int i)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    assert(A::count == i);
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <class D>
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)B<D>::B(A* a) : a_(a) {}
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <class D>
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)B<D>::~B() {}
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)