xref: /aosp_15_r20/external/clang/test/Analysis/inlining/containers.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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