1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// The LLVM Compiler Infrastructure 4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// <memory> 11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// unique_ptr 13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// Test unique_ptr<T[]>(pointer) ctor 15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// unique_ptr<T[]>(pointer) ctor shouldn't require complete type 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <memory> 19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert> 20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A; 22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantclass Deleter 24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int state_; 26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant Deleter(Deleter&); 28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant Deleter& operator=(Deleter&); 29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantpublic: 31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant Deleter() : state_(5) {} 32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int state() const {return state_;} 34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant void operator()(A* p); 36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid check(int i); 39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class D = std::default_delete<A[]> > 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct B 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::unique_ptr<A[], D> a_; 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant explicit B(A*); 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant ~B(); 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A* get() const {return a_.get();} 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant D& get_deleter() {return a_.get_deleter();} 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 51c52f43e72dfcea03037729649da84c23b3beb04aHoward HinnantA* get(); 52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main() 54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A* p = get(); 57c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant check(3); 58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B<> s(p); 59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(s.get() == p); 60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant check(0); 62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 63c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A* p = get(); 64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant check(3); 65c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B<Deleter> s(p); 66c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(s.get() == p); 67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(s.get_deleter().state() == 5); 68c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 69c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant check(0); 70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 71c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 72c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A 73c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 74c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant static int count; 75c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A() {++count;} 76c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A(const A&) {++count;} 77c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant ~A() {--count;} 78c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 79c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 80c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint A::count = 0; 81c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 82c52f43e72dfcea03037729649da84c23b3beb04aHoward HinnantA* get() {return new A[3];} 83c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 84c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid Deleter::operator()(A* p) {delete [] p;} 85c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 86c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid check(int i) 87c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 88c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == i); 89c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 90c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 91c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class D> 92c52f43e72dfcea03037729649da84c23b3beb04aHoward HinnantB<D>::B(A* a) : a_(a) {} 93c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 94c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class D> 95c52f43e72dfcea03037729649da84c23b3beb04aHoward HinnantB<D>::~B() {} 96