1*67e74705SXin Li // RUN: %clang_cc1 -analyze -std=c++11 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors -analyzer-config c++-container-inlining=false -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -analyze -std=c++11 -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors -analyzer-config c++-container-inlining=true -DINLINE=1 -verify %s
3*67e74705SXin Li
4*67e74705SXin Li #ifndef HEADER
5*67e74705SXin Li
6*67e74705SXin Li void clang_analyzer_eval(bool);
7*67e74705SXin Li void clang_analyzer_checkInlined(bool);
8*67e74705SXin Li
9*67e74705SXin Li #define HEADER
10*67e74705SXin Li #include "containers.cpp"
11*67e74705SXin Li #undef HEADER
12*67e74705SXin Li
test()13*67e74705SXin Li void test() {
14*67e74705SXin Li MySet set(0);
15*67e74705SXin Li
16*67e74705SXin Li clang_analyzer_eval(set.isEmpty());
17*67e74705SXin Li #if INLINE
18*67e74705SXin Li // expected-warning@-2 {{TRUE}}
19*67e74705SXin Li #else
20*67e74705SXin Li // expected-warning@-4 {{UNKNOWN}}
21*67e74705SXin Li #endif
22*67e74705SXin Li
23*67e74705SXin Li clang_analyzer_eval(set.raw_begin() == set.raw_end());
24*67e74705SXin Li #if INLINE
25*67e74705SXin Li // expected-warning@-2 {{TRUE}}
26*67e74705SXin Li #else
27*67e74705SXin Li // expected-warning@-4 {{UNKNOWN}}
28*67e74705SXin Li #endif
29*67e74705SXin Li
30*67e74705SXin Li clang_analyzer_eval(set.begin().impl == set.end().impl);
31*67e74705SXin Li #if INLINE
32*67e74705SXin Li // expected-warning@-2 {{TRUE}}
33*67e74705SXin Li #else
34*67e74705SXin Li // expected-warning@-4 {{UNKNOWN}}
35*67e74705SXin Li #endif
36*67e74705SXin Li }
37*67e74705SXin Li
testSubclass(MySetSubclass & sub)38*67e74705SXin Li void testSubclass(MySetSubclass &sub) {
39*67e74705SXin Li sub.useIterator(sub.begin());
40*67e74705SXin Li
41*67e74705SXin Li MySetSubclass local;
42*67e74705SXin Li }
43*67e74705SXin Li
testWrappers(BeginOnlySet & w1,IteratorStructOnlySet & w2,IteratorTypedefOnlySet & w3,IteratorUsingOnlySet & w4)44*67e74705SXin Li void testWrappers(BeginOnlySet &w1, IteratorStructOnlySet &w2,
45*67e74705SXin Li IteratorTypedefOnlySet &w3, IteratorUsingOnlySet &w4) {
46*67e74705SXin Li BeginOnlySet local1;
47*67e74705SXin Li IteratorStructOnlySet local2;
48*67e74705SXin Li IteratorTypedefOnlySet local3;
49*67e74705SXin Li IteratorUsingOnlySet local4;
50*67e74705SXin Li
51*67e74705SXin Li clang_analyzer_eval(w1.begin().impl.impl == w1.begin().impl.impl);
52*67e74705SXin Li #if INLINE
53*67e74705SXin Li // expected-warning@-2 {{TRUE}}
54*67e74705SXin Li #else
55*67e74705SXin Li // expected-warning@-4 {{UNKNOWN}}
56*67e74705SXin Li #endif
57*67e74705SXin Li
58*67e74705SXin Li clang_analyzer_eval(w2.start().impl == w2.start().impl);
59*67e74705SXin Li #if INLINE
60*67e74705SXin Li // expected-warning@-2 {{TRUE}}
61*67e74705SXin Li #else
62*67e74705SXin Li // expected-warning@-4 {{UNKNOWN}}
63*67e74705SXin Li #endif
64*67e74705SXin Li
65*67e74705SXin Li clang_analyzer_eval(w3.start().impl == w3.start().impl);
66*67e74705SXin Li #if INLINE
67*67e74705SXin Li // expected-warning@-2 {{TRUE}}
68*67e74705SXin Li #else
69*67e74705SXin Li // expected-warning@-4 {{UNKNOWN}}
70*67e74705SXin Li #endif
71*67e74705SXin Li
72*67e74705SXin Li clang_analyzer_eval(w4.start().impl == w4.start().impl);
73*67e74705SXin Li #if INLINE
74*67e74705SXin Li // expected-warning@-2 {{TRUE}}
75*67e74705SXin Li #else
76*67e74705SXin Li // expected-warning@-4 {{UNKNOWN}}
77*67e74705SXin Li #endif
78*67e74705SXin Li }
79*67e74705SXin Li
80*67e74705SXin Li
81*67e74705SXin Li #else // HEADER
82*67e74705SXin Li
83*67e74705SXin Li #include "../Inputs/system-header-simulator-cxx.h"
84*67e74705SXin Li
85*67e74705SXin Li class MySet {
86*67e74705SXin Li int *storage;
87*67e74705SXin Li unsigned size;
88*67e74705SXin Li public:
MySet()89*67e74705SXin Li MySet() : storage(0), size(0) {
90*67e74705SXin Li clang_analyzer_checkInlined(true);
91*67e74705SXin Li #if INLINE
92*67e74705SXin Li // expected-warning@-2 {{TRUE}}
93*67e74705SXin Li #endif
94*67e74705SXin Li }
95*67e74705SXin Li
MySet(unsigned n)96*67e74705SXin Li MySet(unsigned n) : storage(new int[n]), size(n) {
97*67e74705SXin Li clang_analyzer_checkInlined(true);
98*67e74705SXin Li #if INLINE
99*67e74705SXin Li // expected-warning@-2 {{TRUE}}
100*67e74705SXin Li #endif
101*67e74705SXin Li }
102*67e74705SXin Li
~MySet()103*67e74705SXin Li ~MySet() { delete[] storage; }
104*67e74705SXin Li
isEmpty()105*67e74705SXin Li bool isEmpty() {
106*67e74705SXin Li clang_analyzer_checkInlined(true);
107*67e74705SXin Li #if INLINE
108*67e74705SXin Li // expected-warning@-2 {{TRUE}}
109*67e74705SXin Li #endif
110*67e74705SXin Li return size == 0;
111*67e74705SXin Li }
112*67e74705SXin Li
113*67e74705SXin Li struct iterator {
114*67e74705SXin Li int *impl;
115*67e74705SXin Li
iteratorMySet::iterator116*67e74705SXin Li iterator(int *p) : impl(p) {}
117*67e74705SXin Li };
118*67e74705SXin Li
begin()119*67e74705SXin Li iterator begin() {
120*67e74705SXin Li clang_analyzer_checkInlined(true);
121*67e74705SXin Li #if INLINE
122*67e74705SXin Li // expected-warning@-2 {{TRUE}}
123*67e74705SXin Li #endif
124*67e74705SXin Li return iterator(storage);
125*67e74705SXin Li }
126*67e74705SXin Li
end()127*67e74705SXin Li iterator end() {
128*67e74705SXin Li clang_analyzer_checkInlined(true);
129*67e74705SXin Li #if INLINE
130*67e74705SXin Li // expected-warning@-2 {{TRUE}}
131*67e74705SXin Li #endif
132*67e74705SXin Li return iterator(storage+size);
133*67e74705SXin Li }
134*67e74705SXin Li
135*67e74705SXin Li typedef int *raw_iterator;
136*67e74705SXin Li
raw_begin()137*67e74705SXin Li raw_iterator raw_begin() {
138*67e74705SXin Li clang_analyzer_checkInlined(true);
139*67e74705SXin Li #if INLINE
140*67e74705SXin Li // expected-warning@-2 {{TRUE}}
141*67e74705SXin Li #endif
142*67e74705SXin Li return storage;
143*67e74705SXin Li }
raw_end()144*67e74705SXin Li raw_iterator raw_end() {
145*67e74705SXin Li clang_analyzer_checkInlined(true);
146*67e74705SXin Li #if INLINE
147*67e74705SXin Li // expected-warning@-2 {{TRUE}}
148*67e74705SXin Li #endif
149*67e74705SXin Li return storage + size;
150*67e74705SXin Li }
151*67e74705SXin Li };
152*67e74705SXin Li
153*67e74705SXin Li class MySetSubclass : public MySet {
154*67e74705SXin Li public:
MySetSubclass()155*67e74705SXin Li MySetSubclass() {
156*67e74705SXin Li clang_analyzer_checkInlined(true);
157*67e74705SXin Li #if INLINE
158*67e74705SXin Li // expected-warning@-2 {{TRUE}}
159*67e74705SXin Li #endif
160*67e74705SXin Li }
161*67e74705SXin Li
useIterator(iterator i)162*67e74705SXin Li void useIterator(iterator i) {
163*67e74705SXin Li clang_analyzer_checkInlined(true);
164*67e74705SXin Li #if INLINE
165*67e74705SXin Li // expected-warning@-2 {{TRUE}}
166*67e74705SXin Li #endif
167*67e74705SXin Li }
168*67e74705SXin Li };
169*67e74705SXin Li
170*67e74705SXin Li class BeginOnlySet {
171*67e74705SXin Li MySet impl;
172*67e74705SXin Li public:
173*67e74705SXin Li struct IterImpl {
174*67e74705SXin Li MySet::iterator impl;
175*67e74705SXin Li typedef std::forward_iterator_tag iterator_category;
176*67e74705SXin Li
IterImplBeginOnlySet::IterImpl177*67e74705SXin Li IterImpl(MySet::iterator i) : impl(i) {
178*67e74705SXin Li clang_analyzer_checkInlined(true);
179*67e74705SXin Li #if INLINE
180*67e74705SXin Li // expected-warning@-2 {{TRUE}}
181*67e74705SXin Li #endif
182*67e74705SXin Li }
183*67e74705SXin Li };
184*67e74705SXin Li
BeginOnlySet()185*67e74705SXin Li BeginOnlySet() {
186*67e74705SXin Li clang_analyzer_checkInlined(true);
187*67e74705SXin Li #if INLINE
188*67e74705SXin Li // expected-warning@-2 {{TRUE}}
189*67e74705SXin Li #endif
190*67e74705SXin Li }
191*67e74705SXin Li
192*67e74705SXin Li typedef IterImpl wrapped_iterator;
193*67e74705SXin Li
begin()194*67e74705SXin Li wrapped_iterator begin() {
195*67e74705SXin Li clang_analyzer_checkInlined(true);
196*67e74705SXin Li #if INLINE
197*67e74705SXin Li // expected-warning@-2 {{TRUE}}
198*67e74705SXin Li #endif
199*67e74705SXin Li return IterImpl(impl.begin());
200*67e74705SXin Li }
201*67e74705SXin Li };
202*67e74705SXin Li
203*67e74705SXin Li class IteratorTypedefOnlySet {
204*67e74705SXin Li MySet impl;
205*67e74705SXin Li public:
206*67e74705SXin Li
IteratorTypedefOnlySet()207*67e74705SXin Li IteratorTypedefOnlySet() {
208*67e74705SXin Li clang_analyzer_checkInlined(true);
209*67e74705SXin Li #if INLINE
210*67e74705SXin Li // expected-warning@-2 {{TRUE}}
211*67e74705SXin Li #endif
212*67e74705SXin Li }
213*67e74705SXin Li
214*67e74705SXin Li typedef MySet::iterator iterator;
215*67e74705SXin Li
start()216*67e74705SXin Li iterator start() {
217*67e74705SXin Li clang_analyzer_checkInlined(true);
218*67e74705SXin Li #if INLINE
219*67e74705SXin Li // expected-warning@-2 {{TRUE}}
220*67e74705SXin Li #endif
221*67e74705SXin Li return impl.begin();
222*67e74705SXin Li }
223*67e74705SXin Li };
224*67e74705SXin Li
225*67e74705SXin Li class IteratorUsingOnlySet {
226*67e74705SXin Li MySet impl;
227*67e74705SXin Li public:
228*67e74705SXin Li
IteratorUsingOnlySet()229*67e74705SXin Li IteratorUsingOnlySet() {
230*67e74705SXin Li clang_analyzer_checkInlined(true);
231*67e74705SXin Li #if INLINE
232*67e74705SXin Li // expected-warning@-2 {{TRUE}}
233*67e74705SXin Li #endif
234*67e74705SXin Li }
235*67e74705SXin Li
236*67e74705SXin Li using iterator = MySet::iterator;
237*67e74705SXin Li
start()238*67e74705SXin Li iterator start() {
239*67e74705SXin Li clang_analyzer_checkInlined(true);
240*67e74705SXin Li #if INLINE
241*67e74705SXin Li // expected-warning@-2 {{TRUE}}
242*67e74705SXin Li #endif
243*67e74705SXin Li return impl.begin();
244*67e74705SXin Li }
245*67e74705SXin Li };
246*67e74705SXin Li
247*67e74705SXin Li class IteratorStructOnlySet {
248*67e74705SXin Li MySet impl;
249*67e74705SXin Li public:
250*67e74705SXin Li
IteratorStructOnlySet()251*67e74705SXin Li IteratorStructOnlySet() {
252*67e74705SXin Li clang_analyzer_checkInlined(true);
253*67e74705SXin Li #if INLINE
254*67e74705SXin Li // expected-warning@-2 {{TRUE}}
255*67e74705SXin Li #endif
256*67e74705SXin Li }
257*67e74705SXin Li
258*67e74705SXin Li struct iterator {
259*67e74705SXin Li int *impl;
260*67e74705SXin Li };
261*67e74705SXin Li
start()262*67e74705SXin Li iterator start() {
263*67e74705SXin Li clang_analyzer_checkInlined(true);
264*67e74705SXin Li #if INLINE
265*67e74705SXin Li // expected-warning@-2 {{TRUE}}
266*67e74705SXin Li #endif
267*67e74705SXin Li return iterator{impl.begin().impl};
268*67e74705SXin Li }
269*67e74705SXin Li };
270*67e74705SXin Li
271*67e74705SXin Li #endif // HEADER
272