null_ctor.pass.cpp revision bc8d3f97eb5c958007f2713238472e0c1c8fe02c
1bb8e6488bda12b41b32fc22397a44510cacdac50Zhongxing Xu//===----------------------------------------------------------------------===// 2fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// 3fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// ��������������������The LLVM Compiler Infrastructure 4fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// 5fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file is distributed under the University of Illinois Open Source 6fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// License. See LICENSE.TXT for details. 7fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// 8fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===// 9fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 10fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// <memory> 11fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 12fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// unique_ptr 13fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 14fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// The deleter is not called if get() == 0 155a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#include <memory> 17fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#include <cassert> 181309f9a3b225ea846e5822691c39a77423125505Ted Kremenek 19d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaksclass Deleter 209b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek{ 219b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek int state_; 22fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 23fda7832b000ff8927386f093b52c067641679469Zhongxing Xu Deleter(Deleter&); 24fda7832b000ff8927386f093b52c067641679469Zhongxing Xu Deleter& operator=(Deleter&); 25c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu 26c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xupublic: 27c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu Deleter() : state_(0) {} 28c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu 29c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu int state() const {return state_;} 309ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek 3143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis void operator()(void*) {++state_;} 325a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis}; 33fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 34b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu 35fda7832b000ff8927386f093b52c067641679469Zhongxing Xuint main() 36fda7832b000ff8927386f093b52c067641679469Zhongxing Xu{ 37d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie Deleter d; 38fda7832b000ff8927386f093b52c067641679469Zhongxing Xu assert(d.state() == 0); 39fda7832b000ff8927386f093b52c067641679469Zhongxing Xu { 40ef3643fbbbf66247c5e205497fae0f46e240c143David Blaikie std::unique_ptr<int[], Deleter&> p(0, d); 41d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu assert(p.get() == 0); 42fda7832b000ff8927386f093b52c067641679469Zhongxing Xu assert(&p.get_deleter() == &d); 43fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 44fda7832b000ff8927386f093b52c067641679469Zhongxing Xu assert(d.state() == 0); 45fda7832b000ff8927386f093b52c067641679469Zhongxing Xu} 4643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis