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)