blob: 9da220e8c328040a2fcd3a09942ca709012488f1 [file] [log] [blame]
Ted Kremenek5d0fb1e2013-12-11 23:44:05 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -triple x86_64-apple-darwin12 -std=c++11 %s > %t 2>&1
2// RUN: FileCheck --input-file=%t %s
Will Dietzdf9a2bb2013-01-07 09:51:17 +00003
4// CHECK: ENTRY
5// CHECK-NEXT: Succs (1): B1
6// CHECK: [B1]
7// CHECK: Succs (21): B2 B3 B4 B5 B6 B7 B8 B9
8// CHECK: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
9// CHECK: B20 B21 B0
10// CHECK: [B0 (EXIT)]
11// CHECK-NEXT: Preds (21): B2 B3 B4 B5 B6 B7 B8 B9
12// CHECK-NEXT: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
13// CHECK-NEXT: B20 B21 B1
Jordan Rose5250b872013-06-03 22:59:41 +000014void checkWrap(int i) {
Will Dietzdf9a2bb2013-01-07 09:51:17 +000015 switch(i) {
16 case 0: break;
17 case 1: break;
18 case 2: break;
19 case 3: break;
20 case 4: break;
21 case 5: break;
22 case 6: break;
23 case 7: break;
24 case 8: break;
25 case 9: break;
26 case 10: break;
27 case 11: break;
28 case 12: break;
29 case 13: break;
30 case 14: break;
31 case 15: break;
32 case 16: break;
33 case 17: break;
34 case 18: break;
35 case 19: break;
36 }
37}
Jordan Rose5250b872013-06-03 22:59:41 +000038
39// CHECK: ENTRY
40// CHECK-NEXT: Succs (1): B1
41// CHECK: [B1]
42// CHECK-NEXT: 1: int i;
43// CHECK-NEXT: 2: int j;
44// CHECK-NEXT: 3: 1
45// CHECK-NEXT: 4: int k = 1;
46// CHECK-NEXT: 5: int l;
47// CHECK-NEXT: 6: 2
48// CHECK-NEXT: 7: int m = 2;
49// CHECK-NEXT: CXXConstructExpr
50// CHECK-NEXT: 9: struct standalone myStandalone;
51// CHECK-NEXT: CXXConstructExpr
52// CHECK-NEXT: 11: struct <anonymous struct at {{.*}}> myAnon;
53// CHECK-NEXT: CXXConstructExpr
54// CHECK-NEXT: 13: struct named myNamed;
55// CHECK-NEXT: Preds (1): B2
56// CHECK-NEXT: Succs (1): B0
57void checkDeclStmts() {
58 int i, j;
59 int k = 1, l, m = 2;
60
61 struct standalone { int x, y; };
62 struct standalone myStandalone;
63
64 struct { int x, y; } myAnon;
65
66 struct named { int x, y; } myNamed;
67
68 static_assert(1, "abc");
69}
David Majnemerf69ce862013-06-04 17:38:44 +000070
71// CHECK: ENTRY
72// CHECK-NEXT: Succs (1): B1
73// CHECK: [B1]
74// CHECK-NEXT: 1: e
75// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, enum EmptyE)
76// CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, IntegralCast, int)
77// CHECK-NEXT: T: switch [B1.3]
78// CHECK-NEXT: Preds (1): B2
79// CHECK-NEXT: Succs (1): B0
80// CHECK: [B0 (EXIT)]
81// CHECK-NEXT: Preds (1): B1
82enum EmptyE {};
83void F(EmptyE e) {
84 switch (e) {}
85}
Jordan Rose5374c072013-08-19 16:27:28 +000086
87// CHECK: ENTRY
88// CHECK-NEXT: Succs (1): B1
89// CHECK: [B1]
90// CHECK-NEXT: 1: __builtin_object_size
91// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, BuiltinFnToFnPtr, unsigned long (*)(const void *, int))
92// CHECK-NEXT: 3: [B1.2](dummy(), 0)
93// CHECK-NEXT: 4: (void)[B1.3] (CStyleCastExpr, ToVoid, void)
94// CHECK-NEXT: Preds (1): B2
95// CHECK-NEXT: Succs (1): B0
96// CHECK: [B0 (EXIT)]
97// CHECK-NEXT: Preds (1): B1
98void testBuiltinSize() {
99 extern int *dummy();
100 (void)__builtin_object_size(dummy(), 0);
101}
Jordan Rosed2f40792013-09-03 17:00:57 +0000102
103
104class A {
105public:
106 A() {}
107 ~A() {}
108};
109
110// CHECK: [B2 (ENTRY)]
111// CHECK-NEXT: Succs (1): B1
112// CHECK: [B1]
113// CHECK-NEXT: 1: (CXXConstructExpr, class A)
114// CHECK-NEXT: 2: new A([B1.1])
115// CHECK-NEXT: 3: A *a = new A();
116// CHECK-NEXT: 4: a
117// CHECK-NEXT: 5: [B1.4] (ImplicitCastExpr, LValueToRValue, class A *)
118// CHECK-NEXT: 6: [B1.5]->~A() (Implicit destructor)
119// CHECK-NEXT: 7: delete [B1.5]
120// CHECK-NEXT: Preds (1): B2
121// CHECK-NEXT: Succs (1): B0
122// CHECK: [B0 (EXIT)]
123// CHECK-NEXT: Preds (1): B1
124void test_deletedtor() {
125 A *a = new A();
126 delete a;
127}
128
129// CHECK: [B2 (ENTRY)]
130// CHECK-NEXT: Succs (1): B1
131// CHECK: [B1]
132// CHECK-NEXT: 1: 5
133// CHECK-NEXT: 2: (CXXConstructExpr, class A)
134// CHECK-NEXT: 3: new A {{\[\[}}B1.1]]
135// CHECK-NEXT: 4: A *a = new A [5];
136// CHECK-NEXT: 5: a
137// CHECK-NEXT: 6: [B1.5] (ImplicitCastExpr, LValueToRValue, class A *)
138// CHECK-NEXT: 7: [B1.6]->~A() (Implicit destructor)
139// CHECK-NEXT: 8: delete [] [B1.6]
140// CHECK-NEXT: Preds (1): B2
141// CHECK-NEXT: Succs (1): B0
142// CHECK: [B0 (EXIT)]
143// CHECK-NEXT: Preds (1): B1
144void test_deleteArraydtor() {
145 A *a = new A[5];
146 delete[] a;
147}
Pavel Labath921e7652013-09-06 08:12:48 +0000148
149
150namespace NoReturnSingleSuccessor {
151 struct A {
152 A();
153 ~A();
154 };
155
156 struct B : public A {
157 B();
158 ~B() __attribute__((noreturn));
159 };
160
161// CHECK: ENTRY
162// CHECK: 1: 1
163// CHECK-NEXT: 2: return
164// CHECK-NEXT: ~B() (Implicit destructor)
165// CHECK-NEXT: Preds (1)
166// CHECK-NEXT: Succs (1): B0
167 int test1(int *x) {
168 B b;
169 if (x)
170 return 1;
171 }
172
173// CHECK: ENTRY
174// CHECK: 1: 1
175// CHECK-NEXT: 2: return
176// CHECK-NEXT: destructor
177// CHECK-NEXT: Preds (1)
178// CHECK-NEXT: Succs (1): B0
179 int test2(int *x) {
180 const A& a = B();
181 if (x)
182 return 1;
183 }
184}
Ted Kremenek5d0fb1e2013-12-11 23:44:05 +0000185
186// Test CFG support for "extending" an enum.
187// CHECK: [B7 (ENTRY)]
188// CHECK-NEXT: Succs (1): B2
189// CHECK: [B1]
190// CHECK-NEXT: 1: x
191// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
192// CHECK-NEXT: 3: return [B1.2];
193// CHECK-NEXT: Preds (4): B3 B4 B5 B6
194// CHECK-NEXT: Succs (1): B0
195// CHECK: [B2]
196// CHECK-NEXT: 1: 0
197// CHECK-NEXT: 2: int x = 0;
198// CHECK-NEXT: 3: value
199// CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, LValueToRValue, enum MyEnum)
200// CHECK-NEXT: 5: [B2.4] (ImplicitCastExpr, IntegralCast, int)
201// CHECK-NEXT: T: switch [B2.5]
202// CHECK-NEXT: Preds (1): B7
203// CHECK-NEXT: Succs (5): B3 B4 B5 B6 NULL
204// CHECK: [B3]
205// CHECK-NEXT: case D:
206// CHECK-NEXT: 1: 4
207// CHECK-NEXT: 2: x
208// CHECK-NEXT: 3: [B3.2] = [B3.1]
209// CHECK-NEXT: T: break;
210// CHECK-NEXT: Preds (1): B2
211// CHECK-NEXT: Succs (1): B1
212// CHECK: [B4]
213// CHECK-NEXT: case C:
214// CHECK-NEXT: 1: 3
215// CHECK-NEXT: 2: x
216// CHECK-NEXT: 3: [B4.2] = [B4.1]
217// CHECK-NEXT: T: break;
218// CHECK-NEXT: Preds (1): B2
219// CHECK-NEXT: Succs (1): B1
220// CHECK: [B5]
221// CHECK-NEXT: case B:
222// CHECK-NEXT: 1: 2
223// CHECK-NEXT: 2: x
224// CHECK-NEXT: 3: [B5.2] = [B5.1]
225// CHECK-NEXT: T: break;
226// CHECK-NEXT: Preds (1): B2
227// CHECK-NEXT: Succs (1): B1
228// CHECK: [B6]
229// CHECK-NEXT: case A:
230// CHECK-NEXT: 1: 1
231// CHECK-NEXT: 2: x
232// CHECK-NEXT: 3: [B6.2] = [B6.1]
233// CHECK-NEXT: T: break;
234// CHECK-NEXT: Preds (1): B2
235// CHECK-NEXT: Succs (1): B1
236// CHECK: [B0 (EXIT)]
237// CHECK-NEXT: Preds (1): B1
238enum MyEnum { A, B, C };
239static const enum MyEnum D = (enum MyEnum) 32;
240
241int test_enum_with_extension(enum MyEnum value) {
242 int x = 0;
243 switch (value) {
244 case A: x = 1; break;
245 case B: x = 2; break;
246 case C: x = 3; break;
247 case D: x = 4; break;
248 }
249 return x;
250}
251
252// CHECK: [B7 (ENTRY)]
253// CHECK-NEXT: Succs (1): B2
254// CHECK: [B1]
255// CHECK-NEXT: 1: x
256// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
257// CHECK-NEXT: 3: return [B1.2];
258// CHECK-NEXT: Preds (4): B3 B4 B5 B6
259// CHECK-NEXT: Succs (1): B0
260// CHECK: [B2]
261// CHECK-NEXT: 1: 0
262// CHECK-NEXT: 2: int x = 0;
263// CHECK-NEXT: 3: value
264// CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, LValueToRValue, enum MyEnum)
265// CHECK-NEXT: 5: [B2.4] (ImplicitCastExpr, IntegralCast, int)
266// CHECK-NEXT: T: switch [B2.5]
267// CHECK-NEXT: Preds (1): B7
268// CHECK-NEXT: Succs (4): B4 B5 B6 NULL
269// CHECK: [B3]
270// CHECK-NEXT: default:
271// CHECK-NEXT: 1: 4
272// CHECK-NEXT: 2: x
273// CHECK-NEXT: 3: [B3.2] = [B3.1]
274// CHECK-NEXT: T: break;
275// CHECK-NEXT: Succs (1): B1
276// CHECK: [B4]
277// CHECK-NEXT: case C:
278// CHECK-NEXT: 1: 3
279// CHECK-NEXT: 2: x
280// CHECK-NEXT: 3: [B4.2] = [B4.1]
281// CHECK-NEXT: T: break;
282// CHECK-NEXT: Preds (1): B2
283// CHECK-NEXT: Succs (1): B1
284// CHECK: [B5]
285// CHECK-NEXT: case B:
286// CHECK-NEXT: 1: 2
287// CHECK-NEXT: 2: x
288// CHECK-NEXT: 3: [B5.2] = [B5.1]
289// CHECK-NEXT: T: break;
290// CHECK-NEXT: Preds (1): B2
291// CHECK-NEXT: Succs (1): B1
292// CHECK: [B6]
293// CHECK-NEXT: case A:
294// CHECK-NEXT: 1: 1
295// CHECK-NEXT: 2: x
296// CHECK-NEXT: 3: [B6.2] = [B6.1]
297// CHECK-NEXT: T: break;
298// CHECK-NEXT: Preds (1): B2
299// CHECK-NEXT: Succs (1): B1
300// CHECK: [B0 (EXIT)]
301// CHECK-NEXT: Preds (1): B1
302int test_enum_with_extension_default(enum MyEnum value) {
303 int x = 0;
304 switch (value) {
305 case A: x = 1; break;
306 case B: x = 2; break;
307 case C: x = 3; break;
308 default: x = 4; break;
309 }
310 return x;
311}