blob: b5b0e5c218a7f6f5a9cbec05031a3746acbb5254 [file] [log] [blame]
Artem Dergachev5fc10332018-02-10 01:55:23 +00001// RUN: %clang_analyze_cc1 -fcxx-exceptions -fexceptions -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=false %s > %t 2>&1
2// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,WARNINGS %s
3// RUN: %clang_analyze_cc1 -fcxx-exceptions -fexceptions -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=true %s > %t 2>&1
4// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,ANALYZER %s
5
6// This file tests how we construct two different flavors of the Clang CFG -
7// the CFG used by the Sema analysis-based warnings and the CFG used by the
8// static analyzer. The difference in the behavior is checked via FileCheck
9// prefixes (WARNINGS and ANALYZER respectively). When introducing new analyzer
10// flags, no new run lines should be added - just these flags would go to the
11// respective line depending on where is it turned on and where is it turned
12// off. Feel free to add tests that test only one of the CFG flavors if you're
13// not sure how the other flavor is supposed to work in your case.
Marcin Swiderski667ffec2010-10-01 00:23:17 +000014
15class A {
16public:
Pavel Labath5bd1fc52013-09-05 09:18:36 +000017// CHECK: [B1 (ENTRY)]
18// CHECK-NEXT: Succs (1): B0
19// CHECK: [B0 (EXIT)]
20// CHECK-NEXT: Preds (1): B1
Marcin Swiderski667ffec2010-10-01 00:23:17 +000021 A() {}
Pavel Labath5bd1fc52013-09-05 09:18:36 +000022
23// CHECK: [B1 (ENTRY)]
24// CHECK-NEXT: Succs (1): B0
25// CHECK: [B0 (EXIT)]
26// CHECK-NEXT: Preds (1): B1
Marcin Swiderski667ffec2010-10-01 00:23:17 +000027 ~A() {}
Pavel Labath5bd1fc52013-09-05 09:18:36 +000028
29// CHECK: [B2 (ENTRY)]
30// CHECK-NEXT: Succs (1): B1
31// CHECK: [B1]
32// CHECK-NEXT: 1: 1
33// CHECK-NEXT: 2: return [B1.1];
34// CHECK-NEXT: Preds (1): B2
35// CHECK-NEXT: Succs (1): B0
36// CHECK: [B0 (EXIT)]
37// CHECK-NEXT: Preds (1): B1
Marcin Swiderski667ffec2010-10-01 00:23:17 +000038 operator int() const { return 1; }
39};
40
41extern const bool UV;
42
Pavel Labath5bd1fc52013-09-05 09:18:36 +000043// CHECK: [B2 (ENTRY)]
44// CHECK-NEXT: Succs (1): B1
45// CHECK: [B1]
Artem Dergachev5fc10332018-02-10 01:55:23 +000046// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
47// ANALYZER-NEXT: 1: (CXXConstructExpr, [B1.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +000048// CHECK-NEXT: 2: A a;
49// CHECK-NEXT: 3: a
50// CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, NoOp, const class A)
51// CHECK-NEXT: 5: const A &b = a;
Artem Dergachev1f68d9d2018-02-15 03:13:36 +000052// WARNINGS-NEXT: 6: A() (CXXConstructExpr, class A)
Artem Dergachev8cc55e92018-02-24 02:07:50 +000053// ANALYZER-NEXT: 6: A() (CXXConstructExpr, [B1.7], [B1.9], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +000054// CHECK-NEXT: 7: [B1.6] (BindTemporary)
55// CHECK-NEXT: 8: [B1.7] (ImplicitCastExpr, NoOp, const class A)
56// CHECK-NEXT: 9: [B1.8]
57// CHECK: 10: const A &c = A();
58// CHECK: 11: [B1.10].~A() (Implicit destructor)
59// CHECK: 12: [B1.2].~A() (Implicit destructor)
60// CHECK-NEXT: Preds (1): B2
61// CHECK-NEXT: Succs (1): B0
62// CHECK: [B0 (EXIT)]
63// CHECK-NEXT: Preds (1): B1
Marcin Swiderski667ffec2010-10-01 00:23:17 +000064void test_const_ref() {
65 A a;
66 const A& b = a;
67 const A& c = A();
68}
69
Pavel Labath5bd1fc52013-09-05 09:18:36 +000070// CHECK: [B2 (ENTRY)]
71// CHECK-NEXT: Succs (1): B1
72// CHECK: [B1]
Artem Dergachev5fc10332018-02-10 01:55:23 +000073// WARNINGS-NEXT: 1: (CXXConstructExpr, class A [2])
74// ANALYZER-NEXT: 1: (CXXConstructExpr, [B1.2], class A [2])
Pavel Labath5bd1fc52013-09-05 09:18:36 +000075// CHECK-NEXT: 2: A a[2];
Artem Dergachev5fc10332018-02-10 01:55:23 +000076// WARNINGS-NEXT: 3: (CXXConstructExpr, class A [0])
77// ANALYZER-NEXT: 3: (CXXConstructExpr, [B1.4], class A [0])
Pavel Labath5bd1fc52013-09-05 09:18:36 +000078// CHECK-NEXT: 4: A b[0];
79// CHECK-NEXT: 5: [B1.2].~A() (Implicit destructor)
80// CHECK-NEXT: Preds (1): B2
81// CHECK-NEXT: Succs (1): B0
82// CHECK: [B0 (EXIT)]
83// CHECK-NEXT: Preds (1): B1
Marcin Swiderski52e4bc12010-10-25 07:00:40 +000084void test_array() {
85 A a[2];
86 A b[0];
87}
88
Pavel Labath5bd1fc52013-09-05 09:18:36 +000089// CHECK: [B2 (ENTRY)]
90// CHECK-NEXT: Succs (1): B1
91// CHECK: [B1]
Artem Dergachev5fc10332018-02-10 01:55:23 +000092// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
93// ANALYZER-NEXT: 1: (CXXConstructExpr, [B1.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +000094// CHECK-NEXT: 2: A a;
Artem Dergachev5fc10332018-02-10 01:55:23 +000095// WARNINGS-NEXT: 3: (CXXConstructExpr, class A)
96// ANALYZER-NEXT: 3: (CXXConstructExpr, [B1.4], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +000097// CHECK-NEXT: 4: A c;
Artem Dergachev5fc10332018-02-10 01:55:23 +000098// WARNINGS-NEXT: 5: (CXXConstructExpr, class A)
99// ANALYZER-NEXT: 5: (CXXConstructExpr, [B1.6], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000100// CHECK-NEXT: 6: A d;
101// CHECK-NEXT: 7: [B1.6].~A() (Implicit destructor)
102// CHECK-NEXT: 8: [B1.4].~A() (Implicit destructor)
Artem Dergachev5fc10332018-02-10 01:55:23 +0000103// WARNINGS-NEXT: 9: (CXXConstructExpr, class A)
104// ANALYZER-NEXT: 9: (CXXConstructExpr, [B1.10], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000105// CHECK: 10: A b;
106// CHECK: 11: [B1.10].~A() (Implicit destructor)
107// CHECK: 12: [B1.2].~A() (Implicit destructor)
108// CHECK-NEXT: Preds (1): B2
109// CHECK-NEXT: Succs (1): B0
110// CHECK: [B0 (EXIT)]
111// CHECK-NEXT: Preds (1): B1
Marcin Swiderski667ffec2010-10-01 00:23:17 +0000112void test_scope() {
113 A a;
114 { A c;
115 A d;
116 }
117 A b;
118}
119
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000120// CHECK: [B4 (ENTRY)]
121// CHECK-NEXT: Succs (1): B3
122// CHECK: [B1]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000123// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
124// ANALYZER-NEXT: 1: (CXXConstructExpr, [B1.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000125// CHECK-NEXT: 2: A c;
126// CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor)
127// CHECK-NEXT: 4: [B3.4].~A() (Implicit destructor)
128// CHECK-NEXT: 5: [B3.2].~A() (Implicit destructor)
129// CHECK-NEXT: Preds (1): B3
130// CHECK-NEXT: Succs (1): B0
131// CHECK: [B2]
132// CHECK-NEXT: 1: return;
133// CHECK-NEXT: 2: [B3.4].~A() (Implicit destructor)
134// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)
135// CHECK-NEXT: Preds (1): B3
136// CHECK-NEXT: Succs (1): B0
137// CHECK: [B3]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000138// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
139// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000140// CHECK-NEXT: 2: A a;
Artem Dergachev5fc10332018-02-10 01:55:23 +0000141// WARNINGS-NEXT: 3: (CXXConstructExpr, class A)
142// ANALYZER-NEXT: 3: (CXXConstructExpr, [B3.4], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000143// CHECK-NEXT: 4: A b;
144// CHECK-NEXT: 5: UV
145// CHECK-NEXT: 6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool)
146// CHECK-NEXT: T: if [B3.6]
147// CHECK-NEXT: Preds (1): B4
148// CHECK-NEXT: Succs (2): B2 B1
149// CHECK: [B0 (EXIT)]
150// CHECK-NEXT: Preds (2): B1 B2
Marcin Swiderski667ffec2010-10-01 00:23:17 +0000151void test_return() {
152 A a;
153 A b;
154 if (UV) return;
155 A c;
156}
157
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000158// CHECK: [B8 (ENTRY)]
159// CHECK-NEXT: Succs (1): B7
160// CHECK: [B1]
161// CHECK: l1:
Artem Dergachev5fc10332018-02-10 01:55:23 +0000162// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
163// ANALYZER-NEXT: 1: (CXXConstructExpr, [B1.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000164// CHECK-NEXT: 2: A c;
165// CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor)
166// CHECK-NEXT: 4: [B6.2].~A() (Implicit destructor)
167// CHECK-NEXT: 5: [B7.2].~A() (Implicit destructor)
168// CHECK-NEXT: Preds (2): B2 B3
169// CHECK-NEXT: Succs (1): B0
170// CHECK: [B2]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000171// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
172// ANALYZER-NEXT: 1: (CXXConstructExpr, [B2.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000173// CHECK-NEXT: 2: A b;
174// CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor)
175// CHECK-NEXT: 4: [B6.4].~A() (Implicit destructor)
176// CHECK-NEXT: Preds (1): B4
177// CHECK-NEXT: Succs (1): B1
178// CHECK: [B3]
179// CHECK-NEXT: 1: [B6.4].~A() (Implicit destructor)
180// CHECK-NEXT: T: goto l1;
181// CHECK: Preds (1): B4
182// CHECK-NEXT: Succs (1): B1
183// CHECK: [B4]
184// CHECK-NEXT: 1: UV
185// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)
186// CHECK-NEXT: T: if [B4.2]
187// CHECK-NEXT: Preds (1): B6
188// CHECK-NEXT: Succs (2): B3 B2
189// CHECK: [B5]
190// CHECK-NEXT: 1: [B6.4].~A() (Implicit destructor)
191// CHECK-NEXT: 2: [B6.2].~A() (Implicit destructor)
192// CHECK-NEXT: T: goto l0;
193// CHECK: Preds (1): B6
194// CHECK-NEXT: Succs (1): B6
195// CHECK: [B6]
196// CHECK: l0:
Artem Dergachev5fc10332018-02-10 01:55:23 +0000197// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
198// ANALYZER-NEXT: 1: (CXXConstructExpr, [B6.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000199// CHECK-NEXT: 2: A b;
Artem Dergachev5fc10332018-02-10 01:55:23 +0000200// WARNINGS-NEXT: 3: (CXXConstructExpr, class A)
201// ANALYZER-NEXT: 3: (CXXConstructExpr, [B6.4], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000202// CHECK-NEXT: 4: A a;
203// CHECK-NEXT: 5: UV
204// CHECK-NEXT: 6: [B6.5] (ImplicitCastExpr, LValueToRValue, _Bool)
205// CHECK-NEXT: T: if [B6.6]
206// CHECK-NEXT: Preds (2): B7 B5
207// CHECK-NEXT: Succs (2): B5 B4
208// CHECK: [B7]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000209// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
210// ANALYZER-NEXT: 1: (CXXConstructExpr, [B7.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000211// CHECK-NEXT: 2: A a;
212// CHECK-NEXT: Preds (1): B8
213// CHECK-NEXT: Succs (1): B6
214// CHECK: [B0 (EXIT)]
215// CHECK-NEXT: Preds (1): B1
Marcin Swiderski667ffec2010-10-01 00:23:17 +0000216void test_goto() {
217 A a;
218l0:
219 A b;
220 { A a;
221 if (UV) goto l0;
222 if (UV) goto l1;
223 A b;
224 }
225l1:
226 A c;
227}
228
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000229// CHECK: [B5 (ENTRY)]
230// CHECK-NEXT: Succs (1): B4
231// CHECK: [B1]
232// CHECK-NEXT: 1: [B4.6].~A() (Implicit destructor)
233// CHECK-NEXT: 2: [B4.2].~A() (Implicit destructor)
234// CHECK-NEXT: Preds (2): B2 B3
235// CHECK-NEXT: Succs (1): B0
236// CHECK: [B2]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000237// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
238// ANALYZER-NEXT: 1: (CXXConstructExpr, [B2.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000239// CHECK-NEXT: 2: A c;
240// CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor)
241// CHECK-NEXT: Preds (1): B4
242// CHECK-NEXT: Succs (1): B1
243// CHECK: [B3]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000244// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
245// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000246// CHECK-NEXT: 2: A c;
247// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)
248// CHECK-NEXT: Preds (1): B4
249// CHECK-NEXT: Succs (1): B1
250// CHECK: [B4]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000251// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
252// ANALYZER-NEXT: 1: (CXXConstructExpr, [B4.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000253// CHECK-NEXT: 2: A a;
254// CHECK-NEXT: 3: a
255// CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, NoOp, const class A)
Artem Dergachev5fc10332018-02-10 01:55:23 +0000256// WARNINGS-NEXT: 5: [B4.4] (CXXConstructExpr, class A)
257// ANALYZER-NEXT: 5: [B4.4] (CXXConstructExpr, [B4.6], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000258// CHECK-NEXT: 6: A b = a;
259// CHECK-NEXT: 7: b
260// CHECK-NEXT: 8: [B4.7] (ImplicitCastExpr, NoOp, const class A)
261// CHECK-NEXT: 9: [B4.8].operator int
Benjamin Kramer00e8a192014-02-25 18:03:55 +0000262// CHECK: 10: [B4.8]
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000263// CHECK: 11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int)
264// CHECK: 12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
265// CHECK-NEXT: T: if [B4.12]
266// CHECK-NEXT: Preds (1): B5
267// CHECK-NEXT: Succs (2): B3 B2
268// CHECK: [B0 (EXIT)]
269// CHECK-NEXT: Preds (1): B1
Marcin Swiderskif883ade2010-10-01 00:52:17 +0000270void test_if_implicit_scope() {
271 A a;
272 if (A b = a)
273 A c;
274 else A c;
275}
276
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000277// CHECK: [B9 (ENTRY)]
278// CHECK-NEXT: Succs (1): B8
279// CHECK: [B1]
280// CHECK-NEXT: 1: [B8.6].~A() (Implicit destructor)
Artem Dergachev5fc10332018-02-10 01:55:23 +0000281// WARNINGS-NEXT: 2: (CXXConstructExpr, class A)
282// ANALYZER-NEXT: 2: (CXXConstructExpr, [B1.3], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000283// CHECK-NEXT: 3: A e;
284// CHECK-NEXT: 4: [B1.3].~A() (Implicit destructor)
285// CHECK-NEXT: 5: [B8.2].~A() (Implicit destructor)
286// CHECK-NEXT: Preds (2): B2 B5
287// CHECK-NEXT: Succs (1): B0
288// CHECK: [B2]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000289// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
290// ANALYZER-NEXT: 1: (CXXConstructExpr, [B2.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000291// CHECK-NEXT: 2: A d;
292// CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor)
293// CHECK-NEXT: 4: [B4.2].~A() (Implicit destructor)
294// CHECK-NEXT: Preds (1): B4
295// CHECK-NEXT: Succs (1): B1
296// CHECK: [B3]
297// CHECK-NEXT: 1: return;
298// CHECK-NEXT: 2: [B4.2].~A() (Implicit destructor)
299// CHECK-NEXT: 3: [B8.6].~A() (Implicit destructor)
300// CHECK-NEXT: 4: [B8.2].~A() (Implicit destructor)
301// CHECK-NEXT: Preds (1): B4
302// CHECK-NEXT: Succs (1): B0
303// CHECK: [B4]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000304// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
305// ANALYZER-NEXT: 1: (CXXConstructExpr, [B4.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000306// CHECK-NEXT: 2: A c;
307// CHECK-NEXT: 3: UV
308// CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool)
309// CHECK-NEXT: T: if [B4.4]
310// CHECK-NEXT: Preds (1): B8
311// CHECK-NEXT: Succs (2): B3 B2
312// CHECK: [B5]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000313// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
314// ANALYZER-NEXT: 1: (CXXConstructExpr, [B5.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000315// CHECK-NEXT: 2: A d;
316// CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor)
317// CHECK-NEXT: 4: [B7.2].~A() (Implicit destructor)
318// CHECK-NEXT: Preds (1): B7
319// CHECK-NEXT: Succs (1): B1
320// CHECK: [B6]
321// CHECK-NEXT: 1: return;
322// CHECK-NEXT: 2: [B7.2].~A() (Implicit destructor)
323// CHECK-NEXT: 3: [B8.6].~A() (Implicit destructor)
324// CHECK-NEXT: 4: [B8.2].~A() (Implicit destructor)
325// CHECK-NEXT: Preds (1): B7
326// CHECK-NEXT: Succs (1): B0
327// CHECK: [B7]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000328// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
329// ANALYZER-NEXT: 1: (CXXConstructExpr, [B7.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000330// CHECK-NEXT: 2: A c;
331// CHECK-NEXT: 3: UV
332// CHECK-NEXT: 4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool)
333// CHECK-NEXT: T: if [B7.4]
334// CHECK-NEXT: Preds (1): B8
335// CHECK-NEXT: Succs (2): B6 B5
336// CHECK: [B8]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000337// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
338// ANALYZER-NEXT: 1: (CXXConstructExpr, [B8.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000339// CHECK-NEXT: 2: A a;
340// CHECK-NEXT: 3: a
341// CHECK-NEXT: 4: [B8.3] (ImplicitCastExpr, NoOp, const class A)
Artem Dergachev5fc10332018-02-10 01:55:23 +0000342// WARNINGS-NEXT: 5: [B8.4] (CXXConstructExpr, class A)
343// ANALYZER-NEXT: 5: [B8.4] (CXXConstructExpr, [B8.6], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000344// CHECK-NEXT: 6: A b = a;
345// CHECK-NEXT: 7: b
346// CHECK-NEXT: 8: [B8.7] (ImplicitCastExpr, NoOp, const class A)
347// CHECK-NEXT: 9: [B8.8].operator int
Benjamin Kramer00e8a192014-02-25 18:03:55 +0000348// CHECK: 10: [B8.8]
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000349// CHECK: 11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int)
350// CHECK: 12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
351// CHECK-NEXT: T: if [B8.12]
352// CHECK-NEXT: Preds (1): B9
353// CHECK-NEXT: Succs (2): B7 B4
354// CHECK: [B0 (EXIT)]
355// CHECK-NEXT: Preds (3): B1 B3 B6
Marcin Swiderskif883ade2010-10-01 00:52:17 +0000356void test_if_jumps() {
357 A a;
358 if (A b = a) {
359 A c;
360 if (UV) return;
361 A d;
362 } else {
363 A c;
364 if (UV) return;
365 A d;
366 }
367 A e;
368}
369
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000370// CHECK: [B6 (ENTRY)]
371// CHECK-NEXT: Succs (1): B5
372// CHECK: [B1]
373// CHECK-NEXT: 1: [B4.4].~A() (Implicit destructor)
374// CHECK-NEXT: 2: [B5.2].~A() (Implicit destructor)
375// CHECK-NEXT: Preds (1): B4
376// CHECK-NEXT: Succs (1): B0
377// CHECK: [B2]
378// CHECK-NEXT: Preds (1): B3
379// CHECK-NEXT: Succs (1): B4
380// CHECK: [B3]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000381// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
382// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000383// CHECK-NEXT: 2: A c;
384// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)
385// CHECK-NEXT: 4: [B4.4].~A() (Implicit destructor)
386// CHECK-NEXT: Preds (1): B4
387// CHECK-NEXT: Succs (1): B2
388// CHECK: [B4]
389// CHECK-NEXT: 1: a
390// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
391// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, class A)
392// CHECK-NEXT: 4: A b = a;
393// CHECK-NEXT: 5: b
394// CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
395// CHECK-NEXT: 7: [B4.6].operator int
Benjamin Kramer00e8a192014-02-25 18:03:55 +0000396// CHECK-NEXT: 8: [B4.6]
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000397// CHECK-NEXT: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
398// CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
399// CHECK-NEXT: T: while [B4.10]
400// CHECK-NEXT: Preds (2): B2 B5
401// CHECK-NEXT: Succs (2): B3 B1
402// CHECK: [B5]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000403// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
404// ANALYZER-NEXT: 1: (CXXConstructExpr, [B5.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000405// CHECK-NEXT: 2: A a;
406// CHECK-NEXT: Preds (1): B6
407// CHECK-NEXT: Succs (1): B4
408// CHECK: [B0 (EXIT)]
409// CHECK-NEXT: Preds (1): B1
Marcin Swiderski1f4e15c2010-10-01 01:14:17 +0000410void test_while_implicit_scope() {
411 A a;
412 while (A b = a)
413 A c;
414}
415
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000416// CHECK: [B12 (ENTRY)]
417// CHECK-NEXT: Succs (1): B11
418// CHECK: [B1]
419// CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor)
Artem Dergachev5fc10332018-02-10 01:55:23 +0000420// WARNINGS-NEXT: 2: (CXXConstructExpr, class A)
421// ANALYZER-NEXT: 2: (CXXConstructExpr, [B1.3], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000422// CHECK-NEXT: 3: A e;
423// CHECK-NEXT: 4: [B1.3].~A() (Implicit destructor)
424// CHECK-NEXT: 5: [B11.2].~A() (Implicit destructor)
425// CHECK-NEXT: Preds (2): B8 B10
426// CHECK-NEXT: Succs (1): B0
427// CHECK: [B2]
428// CHECK-NEXT: Preds (2): B3 B6
429// CHECK-NEXT: Succs (1): B10
430// CHECK: [B3]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000431// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
432// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000433// CHECK-NEXT: 2: A d;
434// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)
435// CHECK-NEXT: 4: [B9.2].~A() (Implicit destructor)
436// CHECK-NEXT: 5: [B10.4].~A() (Implicit destructor)
437// CHECK-NEXT: Preds (1): B5
438// CHECK-NEXT: Succs (1): B2
439// CHECK: [B4]
440// CHECK-NEXT: 1: return;
441// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor)
442// CHECK-NEXT: 3: [B10.4].~A() (Implicit destructor)
443// CHECK-NEXT: 4: [B11.2].~A() (Implicit destructor)
444// CHECK-NEXT: Preds (1): B5
445// CHECK-NEXT: Succs (1): B0
446// CHECK: [B5]
447// CHECK-NEXT: 1: UV
448// CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
449// CHECK-NEXT: T: if [B5.2]
450// CHECK-NEXT: Preds (1): B7
451// CHECK-NEXT: Succs (2): B4 B3
452// CHECK: [B6]
453// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)
454// CHECK-NEXT: 2: [B10.4].~A() (Implicit destructor)
455// CHECK-NEXT: T: continue;
456// CHECK: Preds (1): B7
457// CHECK-NEXT: Succs (1): B2
458// CHECK: [B7]
459// CHECK-NEXT: 1: UV
460// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
461// CHECK-NEXT: T: if [B7.2]
462// CHECK-NEXT: Preds (1): B9
463// CHECK-NEXT: Succs (2): B6 B5
464// CHECK: [B8]
465// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)
466// CHECK-NEXT: T: break;
467// CHECK: Preds (1): B9
468// CHECK-NEXT: Succs (1): B1
469// CHECK: [B9]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000470// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
471// ANALYZER-NEXT: 1: (CXXConstructExpr, [B9.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000472// CHECK-NEXT: 2: A c;
473// CHECK-NEXT: 3: UV
474// CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
475// CHECK-NEXT: T: if [B9.4]
476// CHECK-NEXT: Preds (1): B10
477// CHECK-NEXT: Succs (2): B8 B7
478// CHECK: [B10]
479// CHECK-NEXT: 1: a
480// CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
481// CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, class A)
482// CHECK-NEXT: 4: A b = a;
483// CHECK-NEXT: 5: b
484// CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
485// CHECK-NEXT: 7: [B10.6].operator int
Benjamin Kramer00e8a192014-02-25 18:03:55 +0000486// CHECK-NEXT: 8: [B10.6]
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000487// CHECK-NEXT: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
488// CHECK: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
489// CHECK-NEXT: T: while [B10.10]
490// CHECK-NEXT: Preds (2): B2 B11
491// CHECK-NEXT: Succs (2): B9 B1
492// CHECK: [B11]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000493// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
494// ANALYZER-NEXT: 1: (CXXConstructExpr, [B11.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000495// CHECK-NEXT: 2: A a;
496// CHECK-NEXT: Preds (1): B12
497// CHECK-NEXT: Succs (1): B10
498// CHECK: [B0 (EXIT)]
499// CHECK-NEXT: Preds (2): B1 B4
Marcin Swiderski1f4e15c2010-10-01 01:14:17 +0000500void test_while_jumps() {
501 A a;
502 while (A b = a) {
503 A c;
504 if (UV) break;
505 if (UV) continue;
506 if (UV) return;
507 A d;
508 }
509 A e;
510}
511
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000512// CHECK: [B4 (ENTRY)]
513// CHECK-NEXT: Succs (1): B2
514// CHECK: [B1]
515// CHECK-NEXT: 1: UV
516// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, _Bool)
517// CHECK-NEXT: T: do ... while [B1.2]
518// CHECK-NEXT: Preds (1): B2
519// CHECK-NEXT: Succs (2): B3 B0
520// CHECK: [B2]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000521// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
522// ANALYZER-NEXT: 1: (CXXConstructExpr, [B2.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000523// CHECK-NEXT: 2: A a;
524// CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor)
525// CHECK-NEXT: Preds (2): B3 B4
526// CHECK-NEXT: Succs (1): B1
527// CHECK: [B3]
528// CHECK-NEXT: Preds (1): B1
529// CHECK-NEXT: Succs (1): B2
530// CHECK: [B0 (EXIT)]
531// CHECK-NEXT: Preds (1): B1
Marcin Swiderski1f4e15c2010-10-01 01:14:17 +0000532void test_do_implicit_scope() {
533 do A a;
534 while (UV);
535}
536
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000537// CHECK: [B12 (ENTRY)]
538// CHECK-NEXT: Succs (1): B11
539// CHECK: [B1]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000540// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
541// ANALYZER-NEXT: 1: (CXXConstructExpr, [B1.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000542// CHECK-NEXT: 2: A d;
543// CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor)
544// CHECK-NEXT: 4: [B11.2].~A() (Implicit destructor)
545// CHECK-NEXT: Preds (2): B8 B2
546// CHECK-NEXT: Succs (1): B0
547// CHECK: [B2]
548// CHECK-NEXT: 1: UV
549// CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)
550// CHECK-NEXT: T: do ... while [B2.2]
551// CHECK-NEXT: Preds (2): B3 B6
552// CHECK-NEXT: Succs (2): B10 B1
553// CHECK: [B3]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000554// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
555// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000556// CHECK-NEXT: 2: A c;
557// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)
558// CHECK-NEXT: 4: [B9.2].~A() (Implicit destructor)
559// CHECK-NEXT: Preds (1): B5
560// CHECK-NEXT: Succs (1): B2
561// CHECK: [B4]
562// CHECK-NEXT: 1: return;
563// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor)
564// CHECK-NEXT: 3: [B11.2].~A() (Implicit destructor)
565// CHECK-NEXT: Preds (1): B5
566// CHECK-NEXT: Succs (1): B0
567// CHECK: [B5]
568// CHECK-NEXT: 1: UV
569// CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
570// CHECK-NEXT: T: if [B5.2]
571// CHECK-NEXT: Preds (1): B7
572// CHECK-NEXT: Succs (2): B4 B3
573// CHECK: [B6]
574// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)
575// CHECK-NEXT: T: continue;
576// CHECK: Preds (1): B7
577// CHECK-NEXT: Succs (1): B2
578// CHECK: [B7]
579// CHECK-NEXT: 1: UV
580// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
581// CHECK-NEXT: T: if [B7.2]
582// CHECK-NEXT: Preds (1): B9
583// CHECK-NEXT: Succs (2): B6 B5
584// CHECK: [B8]
585// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)
586// CHECK-NEXT: T: break;
587// CHECK: Preds (1): B9
588// CHECK-NEXT: Succs (1): B1
589// CHECK: [B9]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000590// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
591// ANALYZER-NEXT: 1: (CXXConstructExpr, [B9.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000592// CHECK-NEXT: 2: A b;
593// CHECK-NEXT: 3: UV
594// CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
595// CHECK-NEXT: T: if [B9.4]
596// CHECK-NEXT: Preds (2): B10 B11
597// CHECK-NEXT: Succs (2): B8 B7
598// CHECK: [B10]
599// CHECK-NEXT: Preds (1): B2
600// CHECK-NEXT: Succs (1): B9
601// CHECK: [B11]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000602// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
603// ANALYZER-NEXT: 1: (CXXConstructExpr, [B11.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000604// CHECK-NEXT: 2: A a;
605// CHECK-NEXT: Preds (1): B12
606// CHECK-NEXT: Succs (1): B9
607// CHECK: [B0 (EXIT)]
608// CHECK-NEXT: Preds (2): B1 B4
Marcin Swiderski1f4e15c2010-10-01 01:14:17 +0000609void test_do_jumps() {
610 A a;
611 do {
612 A b;
613 if (UV) break;
614 if (UV) continue;
615 if (UV) return;
616 A c;
617 } while (UV);
618 A d;
619}
620
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000621// CHECK: [B4 (ENTRY)]
622// CHECK-NEXT: Succs (1): B2
623// CHECK: [B1]
624// CHECK-NEXT: 1: [B2.6].~A() (Implicit destructor)
625// CHECK-NEXT: 2: [B2.2].~A() (Implicit destructor)
626// CHECK-NEXT: Preds (2): B3 B2
627// CHECK-NEXT: Succs (1): B0
628// CHECK: [B2]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000629// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
630// ANALYZER-NEXT: 1: (CXXConstructExpr, [B2.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000631// CHECK-NEXT: 2: A a;
632// CHECK-NEXT: 3: a
633// CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
634// CHECK-NEXT: 5: [B2.4] (CXXConstructExpr, class A)
635// CHECK-NEXT: 6: A b = a;
636// CHECK-NEXT: 7: b
637// CHECK-NEXT: 8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
638// CHECK-NEXT: 9: [B2.8].operator int
Benjamin Kramer00e8a192014-02-25 18:03:55 +0000639// CHECK: 10: [B2.8]
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000640// CHECK: 11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
641// CHECK-NEXT: T: switch [B2.11]
642// CHECK-NEXT: Preds (1): B4
643// CHECK-NEXT: Succs (1): B1
644// CHECK: [B3]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000645// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
646// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000647// CHECK-NEXT: 2: A c;
648// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)
649// CHECK-NEXT: Succs (1): B1
650// CHECK: [B0 (EXIT)]
651// CHECK-NEXT: Preds (1): B1
Marcin Swiderskie407a3b2010-10-01 01:24:41 +0000652void test_switch_implicit_scope() {
653 A a;
654 switch (A b = a)
655 A c;
656}
657
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000658// CHECK: [B9 (ENTRY)]
659// CHECK-NEXT: Succs (1): B2
660// CHECK: [B1]
661// CHECK-NEXT: 1: [B2.6].~A() (Implicit destructor)
Artem Dergachev5fc10332018-02-10 01:55:23 +0000662// WARNINGS-NEXT: 2: (CXXConstructExpr, class A)
663// ANALYZER-NEXT: 2: (CXXConstructExpr, [B1.3], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000664// CHECK-NEXT: 3: A g;
665// CHECK-NEXT: 4: [B1.3].~A() (Implicit destructor)
666// CHECK-NEXT: 5: [B2.2].~A() (Implicit destructor)
667// CHECK-NEXT: Preds (3): B3 B7 B2
668// CHECK-NEXT: Succs (1): B0
669// CHECK: [B2]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000670// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
671// ANALYZER-NEXT: 1: (CXXConstructExpr, [B2.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000672// CHECK-NEXT: 2: A a;
673// CHECK-NEXT: 3: a
674// CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
675// CHECK-NEXT: 5: [B2.4] (CXXConstructExpr, class A)
676// CHECK-NEXT: 6: A b = a;
677// CHECK-NEXT: 7: b
678// CHECK-NEXT: 8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
679// CHECK-NEXT: 9: [B2.8].operator int
Benjamin Kramer00e8a192014-02-25 18:03:55 +0000680// CHECK: 10: [B2.8]
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000681// CHECK: 11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
682// CHECK-NEXT: T: switch [B2.11]
683// CHECK-NEXT: Preds (1): B9
684// CHECK-NEXT: Succs (3): B3 B8 B1
685// CHECK: [B3]
686// CHECK: case 1:
687// CHECK-NEXT: T: break;
688// CHECK: Preds (2): B2 B4
689// CHECK-NEXT: Succs (1): B1
690// CHECK: [B4]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000691// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
692// ANALYZER-NEXT: 1: (CXXConstructExpr, [B4.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000693// CHECK-NEXT: 2: A f;
694// CHECK-NEXT: 3: [B4.2].~A() (Implicit destructor)
695// CHECK-NEXT: 4: [B8.2].~A() (Implicit destructor)
696// CHECK-NEXT: Preds (1): B6
697// CHECK-NEXT: Succs (1): B3
698// CHECK: [B5]
699// CHECK-NEXT: 1: return;
700// CHECK-NEXT: 2: [B8.2].~A() (Implicit destructor)
701// CHECK-NEXT: 3: [B2.6].~A() (Implicit destructor)
702// CHECK-NEXT: 4: [B2.2].~A() (Implicit destructor)
703// CHECK-NEXT: Preds (1): B6
704// CHECK-NEXT: Succs (1): B0
705// CHECK: [B6]
706// CHECK-NEXT: 1: UV
707// CHECK-NEXT: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
708// CHECK-NEXT: T: if [B6.2]
709// CHECK-NEXT: Preds (1): B8
710// CHECK-NEXT: Succs (2): B5 B4
711// CHECK: [B7]
712// CHECK-NEXT: 1: [B8.2].~A() (Implicit destructor)
713// CHECK-NEXT: T: break;
714// CHECK: Preds (1): B8
715// CHECK-NEXT: Succs (1): B1
716// CHECK: [B8]
717// CHECK: case 0:
Artem Dergachev5fc10332018-02-10 01:55:23 +0000718// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
719// ANALYZER-NEXT: 1: (CXXConstructExpr, [B8.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000720// CHECK-NEXT: 2: A c;
721// CHECK-NEXT: 3: UV
722// CHECK-NEXT: 4: [B8.3] (ImplicitCastExpr, LValueToRValue, _Bool)
723// CHECK-NEXT: T: if [B8.4]
724// CHECK-NEXT: Preds (1): B2
725// CHECK-NEXT: Succs (2): B7 B6
726// CHECK: [B0 (EXIT)]
727// CHECK-NEXT: Preds (2): B1 B5
Marcin Swiderskie407a3b2010-10-01 01:24:41 +0000728void test_switch_jumps() {
729 A a;
730 switch (A b = a) {
731 case 0: {
732 A c;
733 if (UV) break;
734 if (UV) return;
735 A f;
736 }
737 case 1:
738 break;
739 }
740 A g;
741}
742
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000743// CHECK: [B6 (ENTRY)]
744// CHECK-NEXT: Succs (1): B5
745// CHECK: [B1]
746// CHECK-NEXT: 1: [B4.4].~A() (Implicit destructor)
747// CHECK-NEXT: 2: [B5.2].~A() (Implicit destructor)
748// CHECK-NEXT: Preds (1): B4
749// CHECK-NEXT: Succs (1): B0
750// CHECK: [B2]
751// CHECK-NEXT: Preds (1): B3
752// CHECK-NEXT: Succs (1): B4
753// CHECK: [B3]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000754// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
755// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000756// CHECK-NEXT: 2: A c;
757// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)
758// CHECK-NEXT: 4: [B4.4].~A() (Implicit destructor)
759// CHECK-NEXT: Preds (1): B4
760// CHECK-NEXT: Succs (1): B2
761// CHECK: [B4]
762// CHECK-NEXT: 1: a
763// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
764// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, class A)
765// CHECK-NEXT: 4: A b = a;
766// CHECK-NEXT: 5: b
767// CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
768// CHECK-NEXT: 7: [B4.6].operator int
Benjamin Kramer00e8a192014-02-25 18:03:55 +0000769// CHECK-NEXT: 8: [B4.6]
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000770// CHECK-NEXT: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
771// CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
772// CHECK-NEXT: T: for (...; [B4.10]; )
773// CHECK-NEXT: Preds (2): B2 B5
774// CHECK-NEXT: Succs (2): B3 B1
775// CHECK: [B5]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000776// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
777// ANALYZER-NEXT: 1: (CXXConstructExpr, [B5.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000778// CHECK-NEXT: 2: A a;
779// CHECK-NEXT: Preds (1): B6
780// CHECK-NEXT: Succs (1): B4
781// CHECK: [B0 (EXIT)]
782// CHECK-NEXT: Preds (1): B1
Marcin Swiderski6d5ee0c2010-10-01 01:38:14 +0000783void test_for_implicit_scope() {
784 for (A a; A b = a; )
785 A c;
786}
787
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000788// CHECK: [B12 (ENTRY)]
789// CHECK-NEXT: Succs (1): B11
790// CHECK: [B1]
791// CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor)
792// CHECK-NEXT: 2: [B11.4].~A() (Implicit destructor)
Artem Dergachev5fc10332018-02-10 01:55:23 +0000793// WARNINGS-NEXT: 3: (CXXConstructExpr, class A)
794// ANALYZER-NEXT: 3: (CXXConstructExpr, [B1.4], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000795// CHECK-NEXT: 4: A f;
796// CHECK-NEXT: 5: [B1.4].~A() (Implicit destructor)
797// CHECK-NEXT: 6: [B11.2].~A() (Implicit destructor)
798// CHECK-NEXT: Preds (2): B8 B10
799// CHECK-NEXT: Succs (1): B0
800// CHECK: [B2]
801// CHECK-NEXT: Preds (2): B3 B6
802// CHECK-NEXT: Succs (1): B10
803// CHECK: [B3]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000804// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
805// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000806// CHECK-NEXT: 2: A e;
807// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)
808// CHECK-NEXT: 4: [B9.2].~A() (Implicit destructor)
809// CHECK-NEXT: 5: [B10.4].~A() (Implicit destructor)
810// CHECK-NEXT: Preds (1): B5
811// CHECK-NEXT: Succs (1): B2
812// CHECK: [B4]
813// CHECK-NEXT: 1: return;
814// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor)
815// CHECK-NEXT: 3: [B10.4].~A() (Implicit destructor)
816// CHECK-NEXT: 4: [B11.4].~A() (Implicit destructor)
817// CHECK-NEXT: 5: [B11.2].~A() (Implicit destructor)
818// CHECK-NEXT: Preds (1): B5
819// CHECK-NEXT: Succs (1): B0
820// CHECK: [B5]
821// CHECK-NEXT: 1: UV
822// CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
823// CHECK-NEXT: T: if [B5.2]
824// CHECK-NEXT: Preds (1): B7
825// CHECK-NEXT: Succs (2): B4 B3
826// CHECK: [B6]
827// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)
828// CHECK-NEXT: T: continue;
829// CHECK: Preds (1): B7
830// CHECK-NEXT: Succs (1): B2
831// CHECK: [B7]
832// CHECK-NEXT: 1: UV
833// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
834// CHECK-NEXT: T: if [B7.2]
835// CHECK-NEXT: Preds (1): B9
836// CHECK-NEXT: Succs (2): B6 B5
837// CHECK: [B8]
838// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)
839// CHECK-NEXT: T: break;
840// CHECK: Preds (1): B9
841// CHECK-NEXT: Succs (1): B1
842// CHECK: [B9]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000843// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
844// ANALYZER-NEXT: 1: (CXXConstructExpr, [B9.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000845// CHECK-NEXT: 2: A d;
846// CHECK-NEXT: 3: UV
847// CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
848// CHECK-NEXT: T: if [B9.4]
849// CHECK-NEXT: Preds (1): B10
850// CHECK-NEXT: Succs (2): B8 B7
851// CHECK: [B10]
852// CHECK-NEXT: 1: b
853// CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
854// CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, class A)
855// CHECK-NEXT: 4: A c = b;
856// CHECK-NEXT: 5: c
857// CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
858// CHECK-NEXT: 7: [B10.6].operator int
Benjamin Kramer00e8a192014-02-25 18:03:55 +0000859// CHECK-NEXT: 8: [B10.6]
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000860// CHECK-NEXT: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
861// CHECK: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
862// CHECK-NEXT: T: for (...; [B10.10]; )
863// CHECK-NEXT: Preds (2): B2 B11
864// CHECK-NEXT: Succs (2): B9 B1
865// CHECK: [B11]
Artem Dergachev5fc10332018-02-10 01:55:23 +0000866// WARNINGS-NEXT: 1: (CXXConstructExpr, class A)
867// ANALYZER-NEXT: 1: (CXXConstructExpr, [B11.2], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000868// CHECK-NEXT: 2: A a;
Artem Dergachev5fc10332018-02-10 01:55:23 +0000869// WARNINGS-NEXT: 3: (CXXConstructExpr, class A)
870// ANALYZER-NEXT: 3: (CXXConstructExpr, [B11.4], class A)
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000871// CHECK-NEXT: 4: A b;
872// CHECK-NEXT: Preds (1): B12
873// CHECK-NEXT: Succs (1): B10
874// CHECK: [B0 (EXIT)]
875// CHECK-NEXT: Preds (2): B1 B4
Marcin Swiderski6d5ee0c2010-10-01 01:38:14 +0000876void test_for_jumps() {
877 A a;
878 for (A b; A c = b; ) {
879 A d;
880 if (UV) break;
881 if (UV) continue;
882 if (UV) return;
883 A e;
884 }
885 A f;
886}
887
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000888// CHECK: [B3 (ENTRY)]
889// CHECK-NEXT: Succs (1): B0
890// CHECK: [B1]
891// CHECK-NEXT: T: try ...
892// CHECK-NEXT: Succs (2): B2 B0
893// CHECK: [B2]
894// CHECK-NEXT: catch (const A &e):
895// CHECK-NEXT: 1: catch (const A &e) {
896// CHECK-NEXT: }
897// CHECK-NEXT: Preds (1): B1
898// CHECK-NEXT: Succs (1): B0
899// CHECK: [B0 (EXIT)]
900// CHECK-NEXT: Preds (3): B2 B1 B3
Marcin Swiderski3546b1a2010-10-01 01:46:52 +0000901void test_catch_const_ref() {
902 try {
903 } catch (const A& e) {
904 }
905}
906
Pavel Labath5bd1fc52013-09-05 09:18:36 +0000907// CHECK: [B3 (ENTRY)]
908// CHECK-NEXT: Succs (1): B0
909// CHECK: [B1]
910// CHECK-NEXT: T: try ...
911// CHECK-NEXT: Succs (2): B2 B0
912// CHECK: [B2]
913// CHECK-NEXT: catch (A e):
914// CHECK-NEXT: 1: catch (A e) {
915// CHECK-NEXT: }
916// CHECK-NEXT: 2: [B2.1].~A() (Implicit destructor)
917// CHECK-NEXT: Preds (1): B1
918// CHECK-NEXT: Succs (1): B0
919// CHECK: [B0 (EXIT)]
920// CHECK-NEXT: Preds (3): B2 B1 B3
Marcin Swiderski3546b1a2010-10-01 01:46:52 +0000921void test_catch_copy() {
922 try {
923 } catch (A e) {
924 }
925}