Clang Project

clang_source_code/test/Analysis/scopes-cfg-output.cpp
1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-scopes=true %s > %t 2>&1
2// RUN: FileCheck --input-file=%t %s
3
4class A {
5public:
6// CHECK:      [B1 (ENTRY)]
7// CHECK-NEXT:   Succs (1): B0
8// CHECK:      [B0 (EXIT)]
9// CHECK-NEXT:   Preds (1): B1
10  A() {}
11
12// CHECK:      [B1 (ENTRY)]
13// CHECK-NEXT:   Succs (1): B0
14// CHECK:      [B0 (EXIT)]
15// CHECK-NEXT:   Preds (1): B1
16  ~A() {}
17
18// CHECK:      [B2 (ENTRY)]
19// CHECK-NEXT:   Succs (1): B1
20// CHECK:      [B1]
21// CHECK-NEXT:   1: 1
22// CHECK-NEXT:   2: return [B1.1];
23// CHECK-NEXT:   Preds (1): B2
24// CHECK-NEXT:   Succs (1): B0
25// CHECK:      [B0 (EXIT)]
26// CHECK-NEXT:   Preds (1): B1
27  operator int() const { return 1; }
28};
29
30int getX();
31extern const bool UV;
32
33// CHECK:      [B2 (ENTRY)]
34// CHECK-NEXT:   Succs (1): B1
35// CHECK:      [B1]
36// CHECK-NEXT:   1: CFGScopeBegin(a)
37// CHECK-NEXT:   2:  (CXXConstructExpr, [B1.3], class A [2])
38// CHECK-NEXT:   3: A a[2];
39// CHECK-NEXT:   4:  (CXXConstructExpr, [B1.5], class A [0])
40// CHECK-NEXT:   5: A b[0];
41// CHECK-NEXT:   6: [B1.3].~A() (Implicit destructor)
42// CHECK-NEXT:   7: CFGScopeEnd(a)
43// CHECK-NEXT:   Preds (1): B2
44// CHECK-NEXT:   Succs (1): B0
45// CHECK:      [B0 (EXIT)]
46// CHECK-NEXT:   Preds (1): B1
47void test_array() {
48  A a[2];
49  A b[0];
50}
51
52// CHECK:      [B2 (ENTRY)]
53// CHECK-NEXT:   Succs (1): B1
54// CHECK:      [B1]
55// CHECK-NEXT:   1: CFGScopeBegin(a)
56// CHECK-NEXT:   2:  (CXXConstructExpr, [B1.3], class A)
57// CHECK-NEXT:   3: A a;
58// CHECK-NEXT:   4: CFGScopeBegin(c)
59// CHECK-NEXT:   5:  (CXXConstructExpr, [B1.6], class A)
60// CHECK-NEXT:   6: A c;
61// CHECK-NEXT:   7:  (CXXConstructExpr, [B1.8], class A)
62// CHECK-NEXT:   8: A d;
63// CHECK-NEXT:   9: [B1.8].~A() (Implicit destructor)
64// CHECK-NEXT:  10: [B1.6].~A() (Implicit destructor)
65// CHECK-NEXT:  11: CFGScopeEnd(c)
66// CHECK-NEXT:  12:  (CXXConstructExpr, [B1.13], class A)
67// CHECK-NEXT:  13: A b;
68// CHECK-NEXT:  14: [B1.13].~A() (Implicit destructor)
69// CHECK-NEXT:  15: [B1.3].~A() (Implicit destructor)
70// CHECK-NEXT:  16: CFGScopeEnd(a)
71// CHECK-NEXT:   Preds (1): B2
72// CHECK-NEXT:   Succs (1): B0
73// CHECK:      [B0 (EXIT)]
74// CHECK-NEXT:   Preds (1): B1
75void test_scope() {
76  A a;
77  { A c;
78    A d;
79  }
80  A b;
81}
82
83// CHECK:      [B4 (ENTRY)]
84// CHECK-NEXT:   Succs (1): B3
85// CHECK:      [B1]
86// CHECK-NEXT:   1:  (CXXConstructExpr, [B1.2], class A)
87// CHECK-NEXT:   2: A c;
88// CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)
89// CHECK-NEXT:   4: [B3.5].~A() (Implicit destructor)
90// CHECK-NEXT:   5: [B3.3].~A() (Implicit destructor)
91// CHECK-NEXT:   6: CFGScopeEnd(a)
92// CHECK-NEXT:   Preds (1): B3
93// CHECK-NEXT:   Succs (1): B0
94// CHECK:      [B2]
95// CHECK-NEXT:   1: return;
96// CHECK-NEXT:   2: [B3.5].~A() (Implicit destructor)
97// CHECK-NEXT:   3: [B3.3].~A() (Implicit destructor)
98// CHECK-NEXT:   4: CFGScopeEnd(a)
99// CHECK-NEXT:   Preds (1): B3
100// CHECK-NEXT:   Succs (1): B0
101// CHECK:      [B3]
102// CHECK-NEXT:   1: CFGScopeBegin(a)
103// CHECK-NEXT:   2:  (CXXConstructExpr, [B3.3], class A)
104// CHECK-NEXT:   3: A a;
105// CHECK-NEXT:   4:  (CXXConstructExpr, [B3.5], class A)
106// CHECK-NEXT:   5: A b;
107// CHECK-NEXT:   6: UV
108// CHECK-NEXT:   7: [B3.6] (ImplicitCastExpr, LValueToRValue, _Bool)
109// CHECK-NEXT:   T: if [B3.7]
110// CHECK-NEXT:   Preds (1): B4
111// CHECK-NEXT:   Succs (2): B2 B1
112// CHECK:      [B0 (EXIT)]
113// CHECK-NEXT:   Preds (2): B1 B2
114void test_return() {
115  A a;
116  A b;
117  if (UV) return;
118  A c;
119}
120
121// CHECK:      [B5 (ENTRY)]
122// CHECK-NEXT:   Succs (1): B4
123// CHECK:      [B1]
124// CHECK-NEXT:   1: [B4.8].~A() (Implicit destructor)
125// CHECK-NEXT:   2: CFGScopeEnd(b)
126// CHECK-NEXT:   3: [B4.3].~A() (Implicit destructor)
127// CHECK-NEXT:   4: CFGScopeEnd(a)
128// CHECK-NEXT:   Preds (2): B2 B3
129// CHECK-NEXT:   Succs (1): B0
130// CHECK:      [B2]
131// CHECK-NEXT:   1: CFGScopeBegin(c)
132// CHECK-NEXT:   2:  (CXXConstructExpr, [B2.3], class A)
133// CHECK-NEXT:   3: A c;
134// CHECK-NEXT:   4: [B2.3].~A() (Implicit destructor)
135// CHECK-NEXT:   5: CFGScopeEnd(c)
136// CHECK-NEXT:   Preds (1): B4
137// CHECK-NEXT:   Succs (1): B1
138// CHECK:      [B3]
139// CHECK-NEXT:   1: CFGScopeBegin(c)
140// CHECK-NEXT:   2:  (CXXConstructExpr, [B3.3], class A)
141// CHECK-NEXT:   3: A c;
142// CHECK-NEXT:   4: [B3.3].~A() (Implicit destructor)
143// CHECK-NEXT:   5: CFGScopeEnd(c)
144// CHECK-NEXT:   Preds (1): B4
145// CHECK-NEXT:   Succs (1): B1
146// CHECK:      [B4]
147// CHECK-NEXT:   1: CFGScopeBegin(a)
148// CHECK-NEXT:   2:  (CXXConstructExpr, [B4.3], class A)
149// CHECK-NEXT:   3: A a;
150// CHECK-NEXT:   4: CFGScopeBegin(b)
151// CHECK-NEXT:   5: a
152// CHECK-NEXT:   6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
153// CHECK-NEXT:   7: [B4.6] (CXXConstructExpr, [B4.8], class A)
154// CHECK-NEXT:   8: A b = a;
155// CHECK-NEXT:   9: b
156// CHECK-NEXT:  10: [B4.9] (ImplicitCastExpr, NoOp, const class A)
157// CHECK-NEXT:  11: [B4.10].operator int
158// CHECK-NEXT:  12: [B4.10]
159// CHECK-NEXT:  13: [B4.12] (ImplicitCastExpr, UserDefinedConversion, int)
160// CHECK-NEXT:  14: [B4.13] (ImplicitCastExpr, IntegralToBoolean, _Bool)
161// CHECK-NEXT:   T: if [B4.14]
162// CHECK-NEXT:   Preds (1): B5
163// CHECK-NEXT:   Succs (2): B3 B2
164// CHECK:      [B0 (EXIT)]
165// CHECK-NEXT:   Preds (1): B1
166void test_if_implicit_scope() {
167  A a;
168  if (A b = a)
169    A c;
170  else A c;
171}
172
173// CHECK:      [B9 (ENTRY)]
174// CHECK-NEXT:   Succs (1): B8
175// CHECK:      [B1]
176// CHECK-NEXT:   1: [B8.8].~A() (Implicit destructor)
177// CHECK-NEXT:   2: CFGScopeEnd(b)
178// CHECK-NEXT:   3:  (CXXConstructExpr, [B1.4], class A)
179// CHECK-NEXT:   4: A e;
180// CHECK-NEXT:   5: [B1.4].~A() (Implicit destructor)
181// CHECK-NEXT:   6: [B8.3].~A() (Implicit destructor)
182// CHECK-NEXT:   7: CFGScopeEnd(a)
183// CHECK-NEXT:   Preds (2): B2 B5
184// CHECK-NEXT:   Succs (1): B0
185// CHECK:      [B2]
186// CHECK-NEXT:   1:  (CXXConstructExpr, [B2.2], class A)
187// CHECK-NEXT:   2: A d;
188// CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)
189// CHECK-NEXT:   4: [B4.3].~A() (Implicit destructor)
190// CHECK-NEXT:   5: CFGScopeEnd(c)
191// CHECK-NEXT:   Preds (1): B4
192// CHECK-NEXT:   Succs (1): B1
193// CHECK:      [B3]
194// CHECK-NEXT:   1: return;
195// CHECK-NEXT:   2: [B4.3].~A() (Implicit destructor)
196// CHECK-NEXT:   3: CFGScopeEnd(c)
197// CHECK-NEXT:   4: [B8.8].~A() (Implicit destructor)
198// CHECK-NEXT:   5: CFGScopeEnd(b)
199// CHECK-NEXT:   6: [B8.3].~A() (Implicit destructor)
200// CHECK-NEXT:   7: CFGScopeEnd(a)
201// CHECK-NEXT:   Preds (1): B4
202// CHECK-NEXT:   Succs (1): B0
203// CHECK:      [B4]
204// CHECK-NEXT:   1: CFGScopeBegin(c)
205// CHECK-NEXT:   2:  (CXXConstructExpr, [B4.3], class A)
206// CHECK-NEXT:   3: A c;
207// CHECK-NEXT:   4: UV
208// CHECK-NEXT:   5: [B4.4] (ImplicitCastExpr, LValueToRValue, _Bool)
209// CHECK-NEXT:   T: if [B4.5]
210// CHECK-NEXT:   Preds (1): B8
211// CHECK-NEXT:   Succs (2): B3 B2
212// CHECK:      [B5]
213// CHECK-NEXT:   1:  (CXXConstructExpr, [B5.2], class A)
214// CHECK-NEXT:   2: A d;
215// CHECK-NEXT:   3: [B5.2].~A() (Implicit destructor)
216// CHECK-NEXT:   4: [B7.3].~A() (Implicit destructor)
217// CHECK-NEXT:   5: CFGScopeEnd(c)
218// CHECK-NEXT:   Preds (1): B7
219// CHECK-NEXT:   Succs (1): B1
220// CHECK:      [B6]
221// CHECK-NEXT:   1: return;
222// CHECK-NEXT:   2: [B7.3].~A() (Implicit destructor)
223// CHECK-NEXT:   3: CFGScopeEnd(c)
224// CHECK-NEXT:   4: [B8.8].~A() (Implicit destructor)
225// CHECK-NEXT:   5: CFGScopeEnd(b)
226// CHECK-NEXT:   6: [B8.3].~A() (Implicit destructor)
227// CHECK-NEXT:   7: CFGScopeEnd(a)
228// CHECK-NEXT:   Preds (1): B7
229// CHECK-NEXT:   Succs (1): B0
230// CHECK:      [B7]
231// CHECK-NEXT:   1: CFGScopeBegin(c)
232// CHECK-NEXT:   2:  (CXXConstructExpr, [B7.3], class A)
233// CHECK-NEXT:   3: A c;
234// CHECK-NEXT:   4: UV
235// CHECK-NEXT:   5: [B7.4] (ImplicitCastExpr, LValueToRValue, _Bool)
236// CHECK-NEXT:   T: if [B7.5]
237// CHECK-NEXT:   Preds (1): B8
238// CHECK-NEXT:   Succs (2): B6 B5
239// CHECK:      [B8]
240// CHECK-NEXT:   1: CFGScopeBegin(a)
241// CHECK-NEXT:   2:  (CXXConstructExpr, [B8.3], class A)
242// CHECK-NEXT:   3: A a;
243// CHECK-NEXT:   4: CFGScopeBegin(b)
244// CHECK-NEXT:   5: a
245// CHECK-NEXT:   6: [B8.5] (ImplicitCastExpr, NoOp, const class A)
246// CHECK-NEXT:   7: [B8.6] (CXXConstructExpr, [B8.8], class A)
247// CHECK-NEXT:   8: A b = a;
248// CHECK-NEXT:   9: b
249// CHECK-NEXT:  10: [B8.9] (ImplicitCastExpr, NoOp, const class A)
250// CHECK-NEXT:  11: [B8.10].operator int
251// CHECK-NEXT:  12: [B8.10]
252// CHECK-NEXT:  13: [B8.12] (ImplicitCastExpr, UserDefinedConversion, int)
253// CHECK-NEXT:  14: [B8.13] (ImplicitCastExpr, IntegralToBoolean, _Bool)
254// CHECK-NEXT:   T: if [B8.14]
255// CHECK-NEXT:   Preds (1): B9
256// CHECK-NEXT:   Succs (2): B7 B4
257// CHECK:      [B0 (EXIT)]
258// CHECK-NEXT:   Preds (3): B1 B3 B6
259void test_if_jumps() {
260  A a;
261  if (A b = a) {
262    A c;
263    if (UV) return;
264    A d;
265  } else {
266    A c;
267    if (UV) return;
268    A d;
269  }
270  A e;
271}
272
273// CHECK:      [B6 (ENTRY)]
274// CHECK-NEXT:   Succs (1): B5
275// CHECK:      [B1]
276// CHECK-NEXT:   1: [B4.5].~A() (Implicit destructor)
277// CHECK-NEXT:   2: CFGScopeEnd(b)
278// CHECK-NEXT:   3: [B5.3].~A() (Implicit destructor)
279// CHECK-NEXT:   4: CFGScopeEnd(a)
280// CHECK-NEXT:   Preds (1): B4
281// CHECK-NEXT:   Succs (1): B0
282// CHECK:      [B2]
283// CHECK-NEXT:   Preds (1): B3
284// CHECK-NEXT:   Succs (1): B4
285// CHECK:      [B3]
286// CHECK-NEXT:   1: CFGScopeBegin(c)
287// CHECK-NEXT:   2:  (CXXConstructExpr, [B3.3], class A)
288// CHECK-NEXT:   3: A c;
289// CHECK-NEXT:   4: [B3.3].~A() (Implicit destructor)
290// CHECK-NEXT:   5: CFGScopeEnd(c)
291// CHECK-NEXT:   6: [B4.5].~A() (Implicit destructor)
292// CHECK-NEXT:   7: CFGScopeEnd(b)
293// CHECK-NEXT:   Preds (1): B4
294// CHECK-NEXT:   Succs (1): B2
295// CHECK:      [B4]
296// CHECK-NEXT:   1: CFGScopeBegin(b)
297// CHECK-NEXT:   2: a
298// CHECK-NEXT:   3: [B4.2] (ImplicitCastExpr, NoOp, const class A)
299// CHECK-NEXT:   4: [B4.3] (CXXConstructExpr, [B4.5], class A)
300// CHECK-NEXT:   5: A b = a;
301// CHECK-NEXT:   6: b
302// CHECK-NEXT:   7: [B4.6] (ImplicitCastExpr, NoOp, const class A)
303// CHECK-NEXT:   8: [B4.7].operator int
304// CHECK-NEXT:   9: [B4.7]
305// CHECK-NEXT:  10: [B4.9] (ImplicitCastExpr, UserDefinedConversion, int)
306// CHECK-NEXT:  11: [B4.10] (ImplicitCastExpr, IntegralToBoolean, _Bool)
307// CHECK-NEXT:   T: while [B4.11]
308// CHECK-NEXT:   Preds (2): B2 B5
309// CHECK-NEXT:   Succs (2): B3 B1
310// CHECK:      [B5]
311// CHECK-NEXT:   1: CFGScopeBegin(a)
312// CHECK-NEXT:   2:  (CXXConstructExpr, [B5.3], class A)
313// CHECK-NEXT:   3: A a;
314// CHECK-NEXT:   Preds (1): B6
315// CHECK-NEXT:   Succs (1): B4
316// CHECK:      [B0 (EXIT)]
317// CHECK-NEXT:   Preds (1): B1
318void test_while_implicit_scope() {
319  A a;
320  while (A b = a)
321    A c;
322}
323
324// CHECK:      [B12 (ENTRY)]
325// CHECK-NEXT:   Succs (1): B11
326// CHECK:      [B1]
327// CHECK-NEXT:   1: [B10.5].~A() (Implicit destructor)
328// CHECK-NEXT:   2: CFGScopeEnd(b)
329// CHECK-NEXT:   3:  (CXXConstructExpr, [B1.4], class A)
330// CHECK-NEXT:   4: A e;
331// CHECK-NEXT:   5: [B1.4].~A() (Implicit destructor)
332// CHECK-NEXT:   6: [B11.3].~A() (Implicit destructor)
333// CHECK-NEXT:   7: CFGScopeEnd(a)
334// CHECK-NEXT:   Preds (2): B8 B10
335// CHECK-NEXT:   Succs (1): B0
336// CHECK:      [B2]
337// CHECK-NEXT:   Preds (2): B3 B6
338// CHECK-NEXT:   Succs (1): B10
339// CHECK:      [B3]
340// CHECK-NEXT:   1:  (CXXConstructExpr, [B3.2], class A)
341// CHECK-NEXT:   2: A d;
342// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
343// CHECK-NEXT:   4: [B9.3].~A() (Implicit destructor)
344// CHECK-NEXT:   5: CFGScopeEnd(c)
345// CHECK-NEXT:   6: [B10.5].~A() (Implicit destructor)
346// CHECK-NEXT:   7: CFGScopeEnd(b)
347// CHECK-NEXT:   Preds (1): B5
348// CHECK-NEXT:   Succs (1): B2
349// CHECK:      [B4]
350// CHECK-NEXT:   1: return;
351// CHECK-NEXT:   2: [B9.3].~A() (Implicit destructor)
352// CHECK-NEXT:   3: CFGScopeEnd(c)
353// CHECK-NEXT:   4: [B10.5].~A() (Implicit destructor)
354// CHECK-NEXT:   5: CFGScopeEnd(b)
355// CHECK-NEXT:   6: [B11.3].~A() (Implicit destructor)
356// CHECK-NEXT:   7: CFGScopeEnd(a)
357// CHECK-NEXT:   Preds (1): B5
358// CHECK-NEXT:   Succs (1): B0
359// CHECK:      [B5]
360// CHECK-NEXT:   1: UV
361// CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
362// CHECK-NEXT:   T: if [B5.2]
363// CHECK-NEXT:   Preds (1): B7
364// CHECK-NEXT:   Succs (2): B4 B3
365// CHECK:      [B6]
366// CHECK-NEXT:   1: [B9.3].~A() (Implicit destructor)
367// CHECK-NEXT:   2: CFGScopeEnd(c)
368// CHECK-NEXT:   3: [B10.5].~A() (Implicit destructor)
369// CHECK-NEXT:   4: CFGScopeEnd(b)
370// CHECK-NEXT:   T: continue;
371// CHECK-NEXT:   Preds (1): B7
372// CHECK-NEXT:   Succs (1): B2
373// CHECK:      [B7]
374// CHECK-NEXT:   1: UV
375// CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
376// CHECK-NEXT:   T: if [B7.2]
377// CHECK-NEXT:   Preds (1): B9
378// CHECK-NEXT:   Succs (2): B6 B5
379// CHECK:      [B8]
380// CHECK-NEXT:   1: [B9.3].~A() (Implicit destructor)
381// CHECK-NEXT:   2: CFGScopeEnd(c)
382// CHECK-NEXT:   T: break;
383// CHECK-NEXT:   Preds (1): B9
384// CHECK-NEXT:   Succs (1): B1
385// CHECK:      [B9]
386// CHECK-NEXT:   1: CFGScopeBegin(c)
387// CHECK-NEXT:   2:  (CXXConstructExpr, [B9.3], class A)
388// CHECK-NEXT:   3: A c;
389// CHECK-NEXT:   4: UV
390// CHECK-NEXT:   5: [B9.4] (ImplicitCastExpr, LValueToRValue, _Bool)
391// CHECK-NEXT:   T: if [B9.5]
392// CHECK-NEXT:   Preds (1): B10
393// CHECK-NEXT:   Succs (2): B8 B7
394// CHECK:      [B10]
395// CHECK-NEXT:   1: CFGScopeBegin(b)
396// CHECK-NEXT:   2: a
397// CHECK-NEXT:   3: [B10.2] (ImplicitCastExpr, NoOp, const class A)
398// CHECK-NEXT:   4: [B10.3] (CXXConstructExpr, [B10.5], class A)
399// CHECK-NEXT:   5: A b = a;
400// CHECK-NEXT:   6: b
401// CHECK-NEXT:   7: [B10.6] (ImplicitCastExpr, NoOp, const class A)
402// CHECK-NEXT:   8: [B10.7].operator int
403// CHECK-NEXT:   9: [B10.7]
404// CHECK-NEXT:  10: [B10.9] (ImplicitCastExpr, UserDefinedConversion, int)
405// CHECK-NEXT:  11: [B10.10] (ImplicitCastExpr, IntegralToBoolean, _Bool)
406// CHECK-NEXT:   T: while [B10.11]
407// CHECK-NEXT:   Preds (2): B2 B11
408// CHECK-NEXT:   Succs (2): B9 B1
409// CHECK:      [B11]
410// CHECK-NEXT:   1: CFGScopeBegin(a)
411// CHECK-NEXT:   2:  (CXXConstructExpr, [B11.3], class A)
412// CHECK-NEXT:   3: A a;
413// CHECK-NEXT:   Preds (1): B12
414// CHECK-NEXT:   Succs (1): B10
415// CHECK:      [B0 (EXIT)]
416// CHECK-NEXT:   Preds (2): B1 B4
417void test_while_jumps() {
418  A a;
419  while (A b = a) {
420    A c;
421    if (UV) break;
422    if (UV) continue;
423    if (UV) return;
424    A d;
425  }
426  A e;
427}
428
429// CHECK:      [B12 (ENTRY)]
430// CHECK-NEXT:   Succs (1): B11
431// CHECK:      [B1]
432// CHECK-NEXT:   1:  (CXXConstructExpr, [B1.2], class A)
433// CHECK-NEXT:   2: A d;
434// CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)
435// CHECK-NEXT:   4: [B11.3].~A() (Implicit destructor)
436// CHECK-NEXT:   5: CFGScopeEnd(a)
437// CHECK-NEXT:   Preds (2): B8 B2
438// CHECK-NEXT:   Succs (1): B0
439// CHECK:      [B2]
440// CHECK-NEXT:   1: UV
441// CHECK-NEXT:   2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)
442// CHECK-NEXT:   T: do ... while [B2.2]
443// CHECK-NEXT:   Preds (2): B3 B6
444// CHECK-NEXT:   Succs (2): B10 B1
445// CHECK:      [B3]
446// CHECK-NEXT:   1:  (CXXConstructExpr, [B3.2], class A)
447// CHECK-NEXT:   2: A c;
448// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
449// CHECK-NEXT:   4: [B9.3].~A() (Implicit destructor)
450// CHECK-NEXT:   5: CFGScopeEnd(b)
451// CHECK-NEXT:   Preds (1): B5
452// CHECK-NEXT:   Succs (1): B2
453// CHECK:      [B4]
454// CHECK-NEXT:   1: return;
455// CHECK-NEXT:   2: [B9.3].~A() (Implicit destructor)
456// CHECK-NEXT:   3: CFGScopeEnd(b)
457// CHECK-NEXT:   4: [B11.3].~A() (Implicit destructor)
458// CHECK-NEXT:   5: CFGScopeEnd(a)
459// CHECK-NEXT:   Preds (1): B5
460// CHECK-NEXT:   Succs (1): B0
461// CHECK:      [B5]
462// CHECK-NEXT:   1: UV
463// CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
464// CHECK-NEXT:   T: if [B5.2]
465// CHECK-NEXT:   Preds (1): B7
466// CHECK-NEXT:   Succs (2): B4 B3
467// CHECK:      [B6]
468// CHECK-NEXT:   1: [B9.3].~A() (Implicit destructor)
469// CHECK-NEXT:   2: CFGScopeEnd(b)
470// CHECK-NEXT:   T: continue;
471// CHECK-NEXT:   Preds (1): B7
472// CHECK-NEXT:   Succs (1): B2
473// CHECK:      [B7]
474// CHECK-NEXT:   1: UV
475// CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
476// CHECK-NEXT:   T: if [B7.2]
477// CHECK-NEXT:   Preds (1): B9
478// CHECK-NEXT:   Succs (2): B6 B5
479// CHECK:      [B8]
480// CHECK-NEXT:   1: [B9.3].~A() (Implicit destructor)
481// CHECK-NEXT:   2: CFGScopeEnd(b)
482// CHECK-NEXT:   T: break;
483// CHECK-NEXT:   Preds (1): B9
484// CHECK-NEXT:   Succs (1): B1
485// CHECK:      [B9]
486// CHECK-NEXT:   1: CFGScopeBegin(b)
487// CHECK-NEXT:   2:  (CXXConstructExpr, [B9.3], class A)
488// CHECK-NEXT:   3: A b;
489// CHECK-NEXT:   4: UV
490// CHECK-NEXT:   5: [B9.4] (ImplicitCastExpr, LValueToRValue, _Bool)
491// CHECK-NEXT:   T: if [B9.5]
492// CHECK-NEXT:   Preds (2): B10 B11
493// CHECK-NEXT:   Succs (2): B8 B7
494// CHECK:      [B10]
495// CHECK-NEXT:   Preds (1): B2
496// CHECK-NEXT:   Succs (1): B9
497// CHECK:      [B11]
498// CHECK-NEXT:   1: CFGScopeBegin(a)
499// CHECK-NEXT:   2:  (CXXConstructExpr, [B11.3], class A)
500// CHECK-NEXT:   3: A a;
501// CHECK-NEXT:   Preds (1): B12
502// CHECK-NEXT:   Succs (1): B9
503// CHECK:      [B0 (EXIT)]
504// CHECK-NEXT:   Preds (2): B1 B4
505void test_do_jumps() {
506  A a;
507  do {
508    A b;
509    if (UV) break;
510    if (UV) continue;
511    if (UV) return;
512    A c;
513  } while (UV);
514  A d;
515}
516
517// CHECK:      [B6 (ENTRY)]
518// CHECK-NEXT:   Succs (1): B5
519// CHECK:      [B1]
520// CHECK-NEXT:   1: [B4.5].~A() (Implicit destructor)
521// CHECK-NEXT:   2: CFGScopeEnd(b)
522// CHECK-NEXT:   3: [B5.3].~A() (Implicit destructor)
523// CHECK-NEXT:   4: CFGScopeEnd(a)
524// CHECK-NEXT:   Preds (1): B4
525// CHECK-NEXT:   Succs (1): B0
526// CHECK:      [B2]
527// CHECK-NEXT:   Preds (1): B3
528// CHECK-NEXT:   Succs (1): B4
529// CHECK:      [B3]
530// CHECK-NEXT:   1: CFGScopeBegin(c)
531// CHECK-NEXT:   2:  (CXXConstructExpr, [B3.3], class A)
532// CHECK-NEXT:   3: A c;
533// CHECK-NEXT:   4: [B3.3].~A() (Implicit destructor)
534// CHECK-NEXT:   5: CFGScopeEnd(c)
535// CHECK-NEXT:   6: [B4.5].~A() (Implicit destructor)
536// CHECK-NEXT:   7: CFGScopeEnd(b)
537// CHECK-NEXT:   Preds (1): B4
538// CHECK-NEXT:   Succs (1): B2
539// CHECK:      [B4]
540// CHECK-NEXT:   1: CFGScopeBegin(b)
541// CHECK-NEXT:   2: a
542// CHECK-NEXT:   3: [B4.2] (ImplicitCastExpr, NoOp, const class A)
543// CHECK-NEXT:   4: [B4.3] (CXXConstructExpr, [B4.5], class A)
544// CHECK-NEXT:   5: A b = a;
545// CHECK-NEXT:   6: b
546// CHECK-NEXT:   7: [B4.6] (ImplicitCastExpr, NoOp, const class A)
547// CHECK-NEXT:   8: [B4.7].operator int
548// CHECK-NEXT:   9: [B4.7]
549// CHECK-NEXT:  10: [B4.9] (ImplicitCastExpr, UserDefinedConversion, int)
550// CHECK-NEXT:  11: [B4.10] (ImplicitCastExpr, IntegralToBoolean, _Bool)
551// CHECK-NEXT:   T: for (...; [B4.11]; )
552// CHECK-NEXT:   Preds (2): B2 B5
553// CHECK-NEXT:   Succs (2): B3 B1
554// CHECK:      [B5]
555// CHECK-NEXT:   1: CFGScopeBegin(a)
556// CHECK-NEXT:   2:  (CXXConstructExpr, [B5.3], class A)
557// CHECK-NEXT:   3: A a;
558// CHECK-NEXT:   Preds (1): B6
559// CHECK-NEXT:   Succs (1): B4
560// CHECK:      [B0 (EXIT)]
561// CHECK-NEXT:   Preds (1): B1
562void test_for_implicit_scope() {
563  for (A a; A b = a; )
564    A c;
565}
566
567// CHECK:      [B12 (ENTRY)]
568// CHECK-NEXT:   Succs (1): B11
569// CHECK:      [B1]
570// CHECK-NEXT:   1: [B10.5].~A() (Implicit destructor)
571// CHECK-NEXT:   2: CFGScopeEnd(c)
572// CHECK-NEXT:   3: [B11.6].~A() (Implicit destructor)
573// CHECK-NEXT:   4: CFGScopeEnd(b)
574// CHECK-NEXT:   5:  (CXXConstructExpr, [B1.6], class A)
575// CHECK-NEXT:   6: A f;
576// CHECK-NEXT:   7: [B1.6].~A() (Implicit destructor)
577// CHECK-NEXT:   8: [B11.3].~A() (Implicit destructor)
578// CHECK-NEXT:   9: CFGScopeEnd(a)
579// CHECK-NEXT:   Preds (2): B8 B10
580// CHECK-NEXT:   Succs (1): B0
581// CHECK:      [B2]
582// CHECK-NEXT:   Preds (2): B3 B6
583// CHECK-NEXT:   Succs (1): B10
584// CHECK:      [B3]
585// CHECK-NEXT:   1:  (CXXConstructExpr, [B3.2], class A)
586// CHECK-NEXT:   2: A e;
587// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
588// CHECK-NEXT:   4: [B9.3].~A() (Implicit destructor)
589// CHECK-NEXT:   5: CFGScopeEnd(d)
590// CHECK-NEXT:   6: [B10.5].~A() (Implicit destructor)
591// CHECK-NEXT:   7: CFGScopeEnd(c)
592// CHECK-NEXT:   Preds (1): B5
593// CHECK-NEXT:   Succs (1): B2
594// CHECK:      [B4]
595// CHECK-NEXT:   1: return;
596// CHECK-NEXT:   2: [B9.3].~A() (Implicit destructor)
597// CHECK-NEXT:   3: CFGScopeEnd(d)
598// CHECK-NEXT:   4: [B10.5].~A() (Implicit destructor)
599// CHECK-NEXT:   5: CFGScopeEnd(c)
600// CHECK-NEXT:   6: [B11.6].~A() (Implicit destructor)
601// CHECK-NEXT:   7: CFGScopeEnd(b)
602// CHECK-NEXT:   8: [B11.3].~A() (Implicit destructor)
603// CHECK-NEXT:   9: CFGScopeEnd(a)
604// CHECK-NEXT:   Preds (1): B5
605// CHECK-NEXT:   Succs (1): B0
606// CHECK:      [B5]
607// CHECK-NEXT:   1: UV
608// CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
609// CHECK-NEXT:   T: if [B5.2]
610// CHECK-NEXT:   Preds (1): B7
611// CHECK-NEXT:   Succs (2): B4 B3
612// CHECK:      [B6]
613// CHECK-NEXT:   1: [B9.3].~A() (Implicit destructor)
614// CHECK-NEXT:   2: CFGScopeEnd(d)
615// CHECK-NEXT:   T: continue;
616// CHECK-NEXT:   Preds (1): B7
617// CHECK-NEXT:   Succs (1): B2
618// CHECK:      [B7]
619// CHECK-NEXT:   1: UV
620// CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
621// CHECK-NEXT:   T: if [B7.2]
622// CHECK-NEXT:   Preds (1): B9
623// CHECK-NEXT:   Succs (2): B6 B5
624// CHECK:      [B8]
625// CHECK-NEXT:   1: [B9.3].~A() (Implicit destructor)
626// CHECK-NEXT:   2: CFGScopeEnd(d)
627// CHECK-NEXT:   T: break;
628// CHECK-NEXT:   Preds (1): B9
629// CHECK-NEXT:   Succs (1): B1
630// CHECK:      [B9]
631// CHECK-NEXT:   1: CFGScopeBegin(d)
632// CHECK-NEXT:   2:  (CXXConstructExpr, [B9.3], class A)
633// CHECK-NEXT:   3: A d;
634// CHECK-NEXT:   4: UV
635// CHECK-NEXT:   5: [B9.4] (ImplicitCastExpr, LValueToRValue, _Bool)
636// CHECK-NEXT:   T: if [B9.5]
637// CHECK-NEXT:   Preds (1): B10
638// CHECK-NEXT:   Succs (2): B8 B7
639// CHECK:      [B10]
640// CHECK-NEXT:   1: CFGScopeBegin(c)
641// CHECK-NEXT:   2: b
642// CHECK-NEXT:   3: [B10.2] (ImplicitCastExpr, NoOp, const class A)
643// CHECK-NEXT:   4: [B10.3] (CXXConstructExpr, [B10.5], class A)
644// CHECK-NEXT:   5: A c = b;
645// CHECK-NEXT:   6: c
646// CHECK-NEXT:   7: [B10.6] (ImplicitCastExpr, NoOp, const class A)
647// CHECK-NEXT:   8: [B10.7].operator int
648// CHECK-NEXT:   9: [B10.7]
649// CHECK-NEXT:  10: [B10.9] (ImplicitCastExpr, UserDefinedConversion, int)
650// CHECK-NEXT:  11: [B10.10] (ImplicitCastExpr, IntegralToBoolean, _Bool)
651// CHECK-NEXT:   T: for (...; [B10.11]; )
652// CHECK-NEXT:   Preds (2): B2 B11
653// CHECK-NEXT:   Succs (2): B9 B1
654// CHECK:      [B11]
655// CHECK-NEXT:   1: CFGScopeBegin(a)
656// CHECK-NEXT:   2:  (CXXConstructExpr, [B11.3], class A)
657// CHECK-NEXT:   3: A a;
658// CHECK-NEXT:   4: CFGScopeBegin(b)
659// CHECK-NEXT:   5:  (CXXConstructExpr, [B11.6], class A)
660// CHECK-NEXT:   6: A b;
661// CHECK-NEXT:   Preds (1): B12
662// CHECK-NEXT:   Succs (1): B10
663// CHECK:      [B0 (EXIT)]
664// CHECK-NEXT:   Preds (2): B1 B4
665void test_for_jumps() {
666  A a;
667  for (A b; A c = b; ) {
668    A d;
669    if (UV) break;
670    if (UV) continue;
671    if (UV) return;
672    A e;
673  }
674  A f;
675}
676
677// CHECK:      [B8 (ENTRY)]
678// CHECK-NEXT:   Succs (1): B7
679// CHECK:      [B1]
680// CHECK-NEXT:  l1:
681// CHECK-NEXT:   1:  (CXXConstructExpr, [B1.2], class A)
682// CHECK-NEXT:   2: A c;
683// CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)
684// CHECK-NEXT:   4: [B6.5].~A() (Implicit destructor)
685// CHECK-NEXT:   5: [B6.3].~A() (Implicit destructor)
686// CHECK-NEXT:   6: [B7.3].~A() (Implicit destructor)
687// CHECK-NEXT:   7: CFGScopeEnd(a)
688// CHECK-NEXT:   Preds (2): B2 B3
689// CHECK-NEXT:   Succs (1): B0
690// CHECK:      [B2]
691// CHECK-NEXT:   1:  (CXXConstructExpr, [B2.2], class A)
692// CHECK-NEXT:   2: A b;
693// CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)
694// CHECK-NEXT:   4: [B6.8].~A() (Implicit destructor)
695// CHECK-NEXT:   5: CFGScopeEnd(a)
696// CHECK-NEXT:   Preds (1): B4
697// CHECK-NEXT:   Succs (1): B1
698// CHECK:      [B3]
699// CHECK-NEXT:   1: [B6.8].~A() (Implicit destructor)
700// CHECK-NEXT:   2: CFGScopeEnd(a)
701// CHECK-NEXT:   T: goto l1;
702// CHECK-NEXT:   Preds (1): B4
703// CHECK-NEXT:   Succs (1): B1
704// CHECK:      [B4]
705// CHECK-NEXT:   1: UV
706// CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)
707// CHECK-NEXT:   T: if [B4.2]
708// CHECK-NEXT:   Preds (1): B6
709// CHECK-NEXT:   Succs (2): B3 B2
710// CHECK:      [B5]
711// CHECK-NEXT:   1: [B6.8].~A() (Implicit destructor)
712// CHECK-NEXT:   2: [B6.5].~A() (Implicit destructor)
713// CHECK-NEXT:   3: [B6.3].~A() (Implicit destructor)
714// CHECK-NEXT:   4: CFGScopeEnd(cb)
715// CHECK-NEXT:   T: goto l0;
716// CHECK-NEXT:   Preds (1): B6
717// CHECK-NEXT:   Succs (1): B6
718// CHECK:      [B6]
719// CHECK-NEXT:  l0:
720// CHECK-NEXT:   1: CFGScopeBegin(cb)
721// CHECK-NEXT:   2:  (CXXConstructExpr, [B6.3], class A)
722// CHECK-NEXT:   3: A cb;
723// CHECK-NEXT:   4:  (CXXConstructExpr, [B6.5], class A)
724// CHECK-NEXT:   5: A b;
725// CHECK-NEXT:   6: CFGScopeBegin(a)
726// CHECK-NEXT:   7:  (CXXConstructExpr, [B6.8], class A)
727// CHECK-NEXT:   8: A a;
728// CHECK-NEXT:   9: UV
729// CHECK-NEXT:  10: [B6.9] (ImplicitCastExpr, LValueToRValue, _Bool)
730// CHECK-NEXT:   T: if [B6.10]
731// CHECK-NEXT:   Preds (2): B7 B5
732// CHECK-NEXT:   Succs (2): B5 B4
733// CHECK:      [B7]
734// CHECK-NEXT:   1: CFGScopeBegin(a)
735// CHECK-NEXT:   2:  (CXXConstructExpr, [B7.3], class A)
736// CHECK-NEXT:   3: A a;
737// CHECK-NEXT:   Preds (1): B8
738// CHECK-NEXT:   Succs (1): B6
739// CHECK:      [B0 (EXIT)]
740// CHECK-NEXT:   Preds (1): B1
741void test_goto() {
742  A a;
743l0:
744  A cb;
745  A b;
746  { A a;
747    if (UV) goto l0;
748    if (UV) goto l1;
749    A b;
750  }
751l1:
752  A c;
753}
754
755// CHECK:      [B7 (ENTRY)]
756// CHECK-NEXT:   Succs (1): B6
757// CHECK:      [B1]
758// CHECK-NEXT:   1: CFGScopeEnd(i)
759// CHECK-NEXT:   2: CFGScopeBegin(unused2)
760// CHECK-NEXT:   3: int unused2;
761// CHECK-NEXT:   4: CFGScopeEnd(unused2)
762// CHECK-NEXT:   Preds (2): B4 B5
763// CHECK-NEXT:   Succs (1): B0
764// CHECK:      [B2]
765// CHECK-NEXT:   1: i
766// CHECK-NEXT:   2: ++[B2.1]
767// CHECK-NEXT:   Preds (1): B3
768// CHECK-NEXT:   Succs (1): B5
769// CHECK:      [B3]
770// CHECK-NEXT:   1: CFGScopeEnd(unused1)
771// CHECK-NEXT:   Succs (1): B2
772// CHECK:      [B4]
773// CHECK-NEXT:   1: CFGScopeBegin(unused1)
774// CHECK-NEXT:   2: int unused1;
775// CHECK-NEXT:   3: CFGScopeEnd(unused1)
776// CHECK-NEXT:   T: break;
777// CHECK-NEXT:   Preds (1): B5
778// CHECK-NEXT:   Succs (1): B1
779// CHECK:      [B5]
780// CHECK-NEXT:   1: i
781// CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, int)
782// CHECK-NEXT:   3: 3
783// CHECK-NEXT:   4: [B5.2] < [B5.3]
784// CHECK-NEXT:   T: for (...; [B5.4]; ...)
785// CHECK-NEXT:   Preds (2): B2 B6
786// CHECK-NEXT:   Succs (2): B4 B1
787// CHECK:      [B6]
788// CHECK-NEXT:   1: CFGScopeBegin(i)
789// CHECK-NEXT:   2: 0
790// CHECK-NEXT:   3: int i = 0;
791// CHECK-NEXT:   Preds (1): B7
792// CHECK-NEXT:   Succs (1): B5
793// CHECK:      [B0 (EXIT)]
794// CHECK-NEXT:   Preds (1): B1
795void test_for_compound_and_break() {
796  for (int i = 0; i < 3; ++i) {
797    {
798      int unused1;
799      break;
800    }
801  }
802  {
803    int unused2;
804  }
805}
806
807// CHECK:      [B6 (ENTRY)]
808// CHECK-NEXT:   Succs (1): B5
809// CHECK:      [B1]
810// CHECK-NEXT:   1: CFGScopeEnd(__end1)
811// CHECK-NEXT:   2: CFGScopeEnd(__begin1)
812// CHECK-NEXT:   3: CFGScopeEnd(__range1)
813// CHECK-NEXT:   4: [B5.3].~A() (Implicit destructor)
814// CHECK-NEXT:   5: CFGScopeEnd(a)
815// CHECK-NEXT:   Preds (1): B2
816// CHECK-NEXT:   Succs (1): B0
817// CHECK:      [B2]
818// CHECK-NEXT:   1: __begin1
819// CHECK-NEXT:   2: [B2.1] (ImplicitCastExpr, LValueToRValue, class A *)
820// CHECK-NEXT:   3: __end1
821// CHECK-NEXT:   4: [B2.3] (ImplicitCastExpr, LValueToRValue, class A *)
822// CHECK-NEXT:   5: [B2.2] != [B2.4]
823// CHECK-NEXT:   T: for (auto &i : [B5.4])
824// CHECK:         [B4.11];
825// CHECK:        Preds (2): B3 B5
826// CHECK-NEXT:   Succs (2): B4 B1
827// CHECK:      [B3]
828// CHECK-NEXT:   1: __begin1
829// CHECK-NEXT:   2: ++[B3.1]
830// CHECK-NEXT:   Preds (1): B4
831// CHECK-NEXT:   Succs (1): B2
832// CHECK:      [B4]
833// CHECK-NEXT:   1: CFGScopeBegin(i)
834// CHECK-NEXT:   2: __begin1
835// CHECK-NEXT:   3: [B4.2] (ImplicitCastExpr, LValueToRValue, class A *)
836// CHECK-NEXT:   4: *[B4.3]
837// CHECK-NEXT:   5: auto &i = *__begin1;
838// CHECK-NEXT:   6: operator=
839// CHECK-NEXT:   7: [B4.6] (ImplicitCastExpr, FunctionToPointerDecay, class A &(*)(const class A &)
840// CHECK-NEXT:   8: i
841// CHECK-NEXT:   9: b
842// CHECK-NEXT:  10: [B4.9] (ImplicitCastExpr, NoOp, const class A)
843// CHECK-NEXT:  11: [B4.8] = [B4.10] (OperatorCall)
844// CHECK-NEXT:  12: CFGScopeEnd(i)
845// CHECK-NEXT:   Preds (1): B2
846// CHECK-NEXT:   Succs (1): B3
847// CHECK:      [B5]
848// CHECK-NEXT:   1: CFGScopeBegin(a)
849// CHECK-NEXT:   2:  (CXXConstructExpr, [B5.3], class A [10])
850// CHECK-NEXT:   3: A a[10];
851// CHECK-NEXT:   4: a
852// CHECK-NEXT:   5: auto &&__range1 = a;
853// CHECK-NEXT:   6: CFGScopeBegin(__end1)
854// CHECK-NEXT:   7: __range1
855// CHECK-NEXT:   8: [B5.7] (ImplicitCastExpr, ArrayToPointerDecay, class A *)
856// CHECK-NEXT:   9: 10
857// CHECK-NEXT:  10: [B5.8] + [B5.9]
858// CHECK-NEXT:  11: auto __end1 = __range1 + 10
859// CHECK-NEXT:  12: __range1
860// CHECK-NEXT:  13: [B5.12] (ImplicitCastExpr, ArrayToPointerDecay, class A *)
861// CHECK-NEXT:  14: auto __begin1 = __range1;
862// CHECK-NEXT:   Preds (1): B6
863// CHECK-NEXT:   Succs (1): B2
864// CHECK:      [B0 (EXIT)]
865// CHECK-NEXT:   Preds (1): B1
866void test_range_for(A &b) {
867  A a[10];
868  for (auto &i : a)
869    i = b;
870}
871
872// CHECK:      [B8 (ENTRY)]
873// CHECK-NEXT:   Succs (1): B2
874// CHECK:      [B1]
875// CHECK-NEXT:   1: CFGScopeEnd(i)
876// CHECK-NEXT:   2: 1
877// CHECK-NEXT:   3: int k = 1;
878// CHECK-NEXT:   4: CFGScopeEnd(c)
879// CHECK-NEXT:   Preds (3): B3 B5 B6
880// CHECK-NEXT:   Succs (1): B0
881// CHECK:      [B2]
882// CHECK-NEXT:   1: CFGScopeBegin(c)
883// CHECK-NEXT:   2: '1'
884// CHECK-NEXT:   3: char c = '1';
885// CHECK-NEXT:   4: CFGScopeBegin(i)
886// CHECK-NEXT:   5: getX
887// CHECK-NEXT:   6: [B2.5] (ImplicitCastExpr, FunctionToPointerDecay, int (*)(void))
888// CHECK-NEXT:   7: [B2.6]()
889// CHECK-NEXT:   8: int i = getX();
890// CHECK-NEXT:   9: i
891// CHECK-NEXT:  10: [B2.9] (ImplicitCastExpr, LValueToRValue, int)
892// CHECK-NEXT:   T: switch [B2.10]
893// CHECK-NEXT:   Preds (1): B8
894// CHECK-NEXT:   Succs (5): B4 B5 B6 B7 B3
895// CHECK:      [B3]
896// CHECK-NEXT:  default:
897// CHECK-NEXT:   1: CFGScopeBegin(a)
898// CHECK-NEXT:   2: 0
899// CHECK-NEXT:   3: int a = 0;
900// CHECK-NEXT:   4: i
901// CHECK-NEXT:   5: ++[B3.4]
902// CHECK-NEXT:   6: CFGScopeEnd(a)
903// CHECK-NEXT:   Preds (2): B4 B2
904// CHECK-NEXT:   Succs (1): B1
905// CHECK:      [B4]
906// CHECK-NEXT:  case 3:
907// CHECK-NEXT:   1: '2'
908// CHECK-NEXT:   2: c
909// CHECK-NEXT:   3: [B4.2] = [B4.1]
910// CHECK-NEXT:   Preds (1): B2
911// CHECK-NEXT:   Succs (1): B3
912// CHECK:      [B5]
913// CHECK-NEXT:  case 2:
914// CHECK-NEXT:   1: '2'
915// CHECK-NEXT:   2: c
916// CHECK-NEXT:   3: [B5.2] = [B5.1]
917// CHECK-NEXT:   T: break;
918// CHECK-NEXT:   Preds (1): B2
919// CHECK-NEXT:   Succs (1): B1
920// CHECK:      [B6]
921// CHECK-NEXT:  case 1:
922// CHECK-NEXT:   1: '3'
923// CHECK-NEXT:   2: c
924// CHECK-NEXT:   3: [B6.2] = [B6.1]
925// CHECK-NEXT:   T: break;
926// CHECK-NEXT:   Preds (2): B2 B7
927// CHECK-NEXT:   Succs (1): B1
928// CHECK:      [B7]
929// CHECK-NEXT:  case 0:
930// CHECK-NEXT:   1: '2'
931// CHECK-NEXT:   2: c
932// CHECK-NEXT:   3: [B7.2] = [B7.1]
933// CHECK-NEXT:   Preds (1): B2
934// CHECK-NEXT:   Succs (1): B6
935// CHECK:      [B0 (EXIT)]
936// CHECK-NEXT:   Preds (1): B1
937void test_switch_with_compound_with_default() {
938  char c = '1';
939  switch (int i = getX()) {
940    case 0:
941      c = '2';
942    case 1:
943      c = '3';
944      break;
945    case 2: {
946      c = '2';
947      break;
948    }
949    case 3:
950      c = '2';
951    default: {
952      int a = 0;
953      ++i;
954    }
955    }
956  int k = 1;
957}
958
959// CHECK:      [B6 (ENTRY)]
960// CHECK-NEXT:   Succs (1): B2
961// CHECK:      [B1]
962// CHECK-NEXT:   1: CFGScopeEnd(i)
963// CHECK-NEXT:   2: 3
964// CHECK-NEXT:   3: int k = 3;
965// CHECK-NEXT:   4: CFGScopeEnd(c)
966// CHECK-NEXT:   Preds (3): B3 B4 B2
967// CHECK-NEXT:   Succs (1): B0
968// CHECK:      [B2]
969// CHECK-NEXT:   1: CFGScopeBegin(c)
970// CHECK-NEXT:   2: '1'
971// CHECK-NEXT:   3: char c = '1';
972// CHECK-NEXT:   4: CFGScopeBegin(i)
973// CHECK-NEXT:   5: getX
974// CHECK-NEXT:   6: [B2.5] (ImplicitCastExpr, FunctionToPointerDecay, int (*)(void))
975// CHECK-NEXT:   7: [B2.6]()
976// CHECK-NEXT:   8: int i = getX();
977// CHECK-NEXT:   9: i
978// CHECK-NEXT:  10: [B2.9] (ImplicitCastExpr, LValueToRValue, int)
979// CHECK-NEXT:   T: switch [B2.10]
980// CHECK-NEXT:   Preds (1): B6
981// CHECK-NEXT:   Succs (4): B3 B4 B5 B1
982// CHECK:      [B3]
983// CHECK-NEXT:  case 2:
984// CHECK-NEXT:   1: '3'
985// CHECK-NEXT:   2: c
986// CHECK-NEXT:   3: [B3.2] = [B3.1]
987// CHECK-NEXT:   T: break;
988// CHECK-NEXT:   Preds (1): B2
989// CHECK-NEXT:   Succs (1): B1
990// CHECK:      [B4]
991// CHECK-NEXT:  case 1:
992// CHECK-NEXT:   1: '1'
993// CHECK-NEXT:   2: c
994// CHECK-NEXT:   3: [B4.2] = [B4.1]
995// CHECK-NEXT:   T: break;
996// CHECK-NEXT:   Preds (2): B2 B5
997// CHECK-NEXT:   Succs (1): B1
998// CHECK:      [B5]
999// CHECK-NEXT:  case 0:
1000// CHECK-NEXT:   1: '2'
1001// CHECK-NEXT:   2: c
1002// CHECK-NEXT:   3: [B5.2] = [B5.1]
1003// CHECK-NEXT:   Preds (1): B2
1004// CHECK-NEXT:   Succs (1): B4
1005// CHECK:      [B0 (EXIT)]
1006// CHECK-NEXT:   Preds (1): B1
1007int test_switch_with_compound_without_default() {
1008  char c = '1';
1009  switch (int i = getX()) {
1010    case 0:
1011      c = '2';
1012    case 1:
1013      c = '1';
1014      break;
1015    case 2:
1016      c = '3';
1017      break;
1018   }
1019  int k = 3;
1020}
1021
1022// CHECK:      [B5 (ENTRY)]
1023// CHECK-NEXT:   Succs (1): B2
1024// CHECK:      [B1]
1025// CHECK-NEXT:   1: CFGScopeEnd(i)
1026// CHECK-NEXT:   2: 1
1027// CHECK-NEXT:   3: int k = 1;
1028// CHECK-NEXT:   4: CFGScopeEnd(s)
1029// CHECK-NEXT:   Preds (1): B3
1030// CHECK-NEXT:   Succs (1): B0
1031// CHECK:      [B2]
1032// CHECK-NEXT:   1: CFGScopeBegin(s)
1033// CHECK-NEXT:   2: '1'
1034// CHECK-NEXT:   3: char s = '1';
1035// CHECK-NEXT:   4: CFGScopeBegin(i)
1036// CHECK-NEXT:   5: getX
1037// CHECK-NEXT:   6: [B2.5] (ImplicitCastExpr, FunctionToPointerDecay, int (*)(void))
1038// CHECK-NEXT:   7: [B2.6]()
1039// CHECK-NEXT:   8: int i = getX();
1040// CHECK-NEXT:   9: i
1041// CHECK-NEXT:  10: [B2.9] (ImplicitCastExpr, LValueToRValue, int)
1042// CHECK-NEXT:   T: switch [B2.10]
1043// CHECK-NEXT:   Preds (1): B5
1044// CHECK-NEXT:   Succs (2): B4 B3
1045// CHECK:      [B3]
1046// CHECK-NEXT:  default:
1047// CHECK-NEXT:   1: CFGScopeBegin(a)
1048// CHECK-NEXT:   2: 0
1049// CHECK-NEXT:   3: int a = 0;
1050// CHECK-NEXT:   4: i
1051// CHECK-NEXT:   5: ++[B3.4]
1052// CHECK-NEXT:   6: CFGScopeEnd(a)
1053// CHECK-NEXT:   Preds (2): B4 B2
1054// CHECK-NEXT:   Succs (1): B1
1055// CHECK:      [B4]
1056// CHECK-NEXT:  case 0:
1057// CHECK-NEXT:   Preds (1): B2
1058// CHECK-NEXT:   Succs (1): B3
1059// CHECK:      [B0 (EXIT)]
1060// CHECK-NEXT:   Preds (1): B1
1061void test_without_compound() {
1062  char s = '1';
1063  switch (int i = getX())
1064    case 0:
1065    default: {
1066      int a = 0;
1067      ++i;
1068    }
1069  int k = 1;
1070}
1071
1072// CHECK:      [B12 (ENTRY)]
1073// CHECK-NEXT:   Succs (1): B11
1074// CHECK:      [B1]
1075// CHECK-NEXT:   1: CFGScopeEnd(i)
1076// CHECK-NEXT:   Preds (2): B4 B10
1077// CHECK-NEXT:   Succs (1): B0
1078// CHECK:      [B2]
1079// CHECK-NEXT:   1: i
1080// CHECK-NEXT:   2: ++[B2.1]
1081// CHECK-NEXT:   Preds (2): B3 B7
1082// CHECK-NEXT:   Succs (1): B10
1083// CHECK:      [B3]
1084// CHECK-NEXT:   1: CFGScopeEnd(z)
1085// CHECK-NEXT:   Succs (1): B2
1086// CHECK:      [B4]
1087// CHECK-NEXT:   1: CFGScopeBegin(z)
1088// CHECK-NEXT:   2: 5
1089// CHECK-NEXT:   3: int z = 5;
1090// CHECK-NEXT:   4: CFGScopeEnd(z)
1091// CHECK-NEXT:   T: break;
1092// CHECK-NEXT:   Preds (2): B6 B8
1093// CHECK-NEXT:   Succs (1): B1
1094// CHECK:      [B5]
1095// CHECK-NEXT:   1: x
1096// CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, int)
1097// CHECK-NEXT:   T: switch [B5.2]
1098// CHECK-NEXT:   Preds (1): B10
1099// CHECK-NEXT:   Succs (4): B7 B8 B9 B6
1100// CHECK:      [B6]
1101// CHECK-NEXT:  default:
1102// CHECK-NEXT:   1: 3
1103// CHECK-NEXT:   2: y
1104// CHECK-NEXT:   3: [B6.2] = [B6.1]
1105// CHECK-NEXT:   Preds (1): B5
1106// CHECK-NEXT:   Succs (1): B4
1107// CHECK:      [B7]
1108// CHECK-NEXT:  case 2:
1109// CHECK-NEXT:   1: 4
1110// CHECK-NEXT:   2: y
1111// CHECK-NEXT:   3: [B7.2] = [B7.1]
1112// CHECK-NEXT:   T: continue;
1113// CHECK-NEXT:   Preds (1): B5
1114// CHECK-NEXT:   Succs (1): B2
1115// CHECK:      [B8]
1116// CHECK-NEXT:  case 1:
1117// CHECK-NEXT:   1: 2
1118// CHECK-NEXT:   2: y
1119// CHECK-NEXT:   3: [B8.2] = [B8.1]
1120// CHECK-NEXT:   T: break;
1121// CHECK-NEXT:   Preds (2): B5 B9
1122// CHECK-NEXT:   Succs (1): B4
1123// CHECK:      [B9]
1124// CHECK-NEXT:  case 0:
1125// CHECK-NEXT:   1: 1
1126// CHECK-NEXT:   2: y
1127// CHECK-NEXT:   3: [B9.2] = [B9.1]
1128// CHECK-NEXT:   Preds (1): B5
1129// CHECK-NEXT:   Succs (1): B8
1130// CHECK:      [B10]
1131// CHECK-NEXT:   1: i
1132// CHECK-NEXT:   2: [B10.1] (ImplicitCastExpr, LValueToRValue, int)
1133// CHECK-NEXT:   3: 1000
1134// CHECK-NEXT:   4: [B10.2] < [B10.3]
1135// CHECK-NEXT:   T: for (...; [B10.4]; ...)
1136// CHECK-NEXT:   Preds (2): B2 B11
1137// CHECK-NEXT:   Succs (2): B5 B1
1138// CHECK:      [B11]
1139// CHECK-NEXT:   1: CFGScopeBegin(i)
1140// CHECK-NEXT:   2: int i;
1141// CHECK-NEXT:   3: int x;
1142// CHECK-NEXT:   4: int y;
1143// CHECK-NEXT:   5: 0
1144// CHECK-NEXT:   6: i
1145// CHECK-NEXT:   7: [B11.6] = [B11.5]
1146// CHECK-NEXT:   Preds (1): B12
1147// CHECK-NEXT:   Succs (1): B10
1148// CHECK:      [B0 (EXIT)]
1149// CHECK-NEXT:   Preds (1): B1
1150void test_for_switch_in_for() {
1151  int i, x, y;
1152  for (i = 0; i < 1000; ++i) {
1153    switch (x) {
1154    case 0:
1155      y = 1;
1156    case 1:
1157      y = 2;
1158      break; // break from switch
1159    case 2:
1160      y = 4;
1161      continue; // continue in loop
1162    default:
1163      y = 3;
1164    }
1165    {
1166      int z = 5;
1167      break; // break from loop
1168    }
1169  }
1170}
1171