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