auto-obj-dtors-cfg-output.cpp revision 3d115cfd1b9c48155d478b1f2f14dba1b6ba9a91
1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG %s > %t 2>&1
2// RUN: FileCheck --input-file=%t %s
3
4class A {
5public:
6  A() {}
7  ~A() {}
8  operator int() const { return 1; }
9};
10
11extern const bool UV;
12
13void test_const_ref() {
14  A a;
15  const A& b = a;
16  const A& c = A();
17}
18
19void test_array() {
20  A a[2];
21  A b[0];
22}
23
24void test_scope() {
25  A a;
26  { A c;
27    A d;
28  }
29  A b;
30}
31
32void test_return() {
33  A a;
34  A b;
35  if (UV) return;
36  A c;
37}
38
39void test_goto() {
40  A a;
41l0:
42  A b;
43  { A a;
44    if (UV) goto l0;
45    if (UV) goto l1;
46    A b;
47  }
48l1:
49  A c;
50}
51
52void test_if_implicit_scope() {
53  A a;
54  if (A b = a)
55    A c;
56  else A c;
57}
58
59void test_if_jumps() {
60  A a;
61  if (A b = a) {
62    A c;
63    if (UV) return;
64    A d;
65  } else {
66    A c;
67    if (UV) return;
68    A d;
69  }
70  A e;
71}
72
73void test_while_implicit_scope() {
74  A a;
75  while (A b = a)
76    A c;
77}
78
79void test_while_jumps() {
80  A a;
81  while (A b = a) {
82    A c;
83    if (UV) break;
84    if (UV) continue;
85    if (UV) return;
86    A d;
87  }
88  A e;
89}
90
91void test_do_implicit_scope() {
92  do A a;
93  while (UV);
94}
95
96void test_do_jumps() {
97  A a;
98  do {
99    A b;
100    if (UV) break;
101    if (UV) continue;
102    if (UV) return;
103    A c;
104  } while (UV);
105  A d;
106}
107
108void test_switch_implicit_scope() {
109  A a;
110  switch (A b = a)
111    A c;
112}
113
114void test_switch_jumps() {
115  A a;
116  switch (A b = a) {
117  case 0: {
118    A c;
119    if (UV) break;
120    if (UV) return;
121    A f;
122  }
123  case 1:
124    break;
125  }
126  A g;
127}
128
129void test_for_implicit_scope() {
130  for (A a; A b = a; )
131    A c;
132}
133
134void test_for_jumps() {
135  A a;
136  for (A b; A c = b; ) {
137    A d;
138    if (UV) break;
139    if (UV) continue;
140    if (UV) return;
141    A e;
142  }
143  A f;
144}
145
146void test_catch_const_ref() {
147  try {
148  } catch (const A& e) {
149  }
150}
151
152void test_catch_copy() {
153  try {
154  } catch (A e) {
155  }
156}
157
158// CHECK:  [B1 (ENTRY)]
159// CHECK:    Succs (1): B0
160// CHECK:  [B0 (EXIT)]
161// CHECK:    Preds (1): B1
162// CHECK:  [B1 (ENTRY)]
163// CHECK:    Succs (1): B0
164// CHECK:  [B0 (EXIT)]
165// CHECK:    Preds (1): B1
166// CHECK:  [B2 (ENTRY)]
167// CHECK:    Succs (1): B1
168// CHECK:  [B1]
169// CHECK:    1: 1
170// CHECK:    2: return [B1.1];
171// CHECK:    Preds (1): B2
172// CHECK:    Succs (1): B0
173// CHECK:  [B0 (EXIT)]
174// CHECK:    Preds (1): B1
175// CHECK:  [B2 (ENTRY)]
176// CHECK:    Succs (1): B1
177// CHECK:  [B1]
178// CHECK:    1:  (CXXConstructExpr, class A)
179// CHECK:    2: A a;
180// CHECK:    3: a
181// CHECK:    4: [B1.3] (ImplicitCastExpr, NoOp, const class A)
182// CHECK:    5: const A &b = a;
183// CHECK:    6: A() (CXXConstructExpr, class A)
184// CHECK:    7: [B1.6] (BindTemporary)
185// CHECK:    8: [B1.7] (ImplicitCastExpr, NoOp, const class A)
186// CHECK:    9: [B1.8]
187// CHECK:   10: const A &c = A();
188// CHECK:   11: [B1.10].~A() (Implicit destructor)
189// CHECK:   12: [B1.2].~A() (Implicit destructor)
190// CHECK:    Preds (1): B2
191// CHECK:    Succs (1): B0
192// CHECK:  [B0 (EXIT)]
193// CHECK:    Preds (1): B1
194// CHECK:  [B2 (ENTRY)]
195// CHECK:    Succs (1): B1
196// CHECK:  [B1]
197// CHECK:    1:  (CXXConstructExpr, class A [2])
198// CHECK:    2: A a[2];
199// CHECK:    3:  (CXXConstructExpr, class A [0])
200// CHECK:    4: A b[0];
201// CHECK:    5: [B1.2].~A() (Implicit destructor)
202// CHECK:    Preds (1): B2
203// CHECK:    Succs (1): B0
204// CHECK:  [B0 (EXIT)]
205// CHECK:    Preds (1): B1
206// CHECK:  [B2 (ENTRY)]
207// CHECK:    Succs (1): B1
208// CHECK:  [B1]
209// CHECK:    1:  (CXXConstructExpr, class A)
210// CHECK:    2: A a;
211// CHECK:    3:  (CXXConstructExpr, class A)
212// CHECK:    4: A c;
213// CHECK:    5:  (CXXConstructExpr, class A)
214// CHECK:    6: A d;
215// CHECK:    7: [B1.6].~A() (Implicit destructor)
216// CHECK:    8: [B1.4].~A() (Implicit destructor)
217// CHECK:    9:  (CXXConstructExpr, class A)
218// CHECK:   10: A b;
219// CHECK:   11: [B1.10].~A() (Implicit destructor)
220// CHECK:   12: [B1.2].~A() (Implicit destructor)
221// CHECK:    Preds (1): B2
222// CHECK:    Succs (1): B0
223// CHECK:  [B0 (EXIT)]
224// CHECK:    Preds (1): B1
225// CHECK:  [B4 (ENTRY)]
226// CHECK:    Succs (1): B3
227// CHECK:  [B1]
228// CHECK:    1:  (CXXConstructExpr, class A)
229// CHECK:    2: A c;
230// CHECK:    3: [B1.2].~A() (Implicit destructor)
231// CHECK:    4: [B3.4].~A() (Implicit destructor)
232// CHECK:    5: [B3.2].~A() (Implicit destructor)
233// CHECK:    Preds (1): B3
234// CHECK:    Succs (1): B0
235// CHECK:  [B2]
236// CHECK:    1: return;
237// CHECK:    2: [B3.4].~A() (Implicit destructor)
238// CHECK:    3: [B3.2].~A() (Implicit destructor)
239// CHECK:    Preds (1): B3
240// CHECK:    Succs (1): B0
241// CHECK:  [B3]
242// CHECK:    1:  (CXXConstructExpr, class A)
243// CHECK:    2: A a;
244// CHECK:    3:  (CXXConstructExpr, class A)
245// CHECK:    4: A b;
246// CHECK:    5: UV
247// CHECK:    6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool)
248// CHECK:    T: if [B3.6]
249// CHECK:    Preds (1): B4
250// CHECK:    Succs (2): B2 B1
251// CHECK:  [B0 (EXIT)]
252// CHECK:    Preds (2): B1 B2
253// CHECK:  [B8 (ENTRY)]
254// CHECK:    Succs (1): B7
255// CHECK:  [B1]
256// CHECK:   l1:
257// CHECK:    1:  (CXXConstructExpr, class A)
258// CHECK:    2: A c;
259// CHECK:    3: [B1.2].~A() (Implicit destructor)
260// CHECK:    4: [B6.2].~A() (Implicit destructor)
261// CHECK:    5: [B7.2].~A() (Implicit destructor)
262// CHECK:    Preds (2): B2 B3
263// CHECK:    Succs (1): B0
264// CHECK:  [B2]
265// CHECK:    1:  (CXXConstructExpr, class A)
266// CHECK:    2: A b;
267// CHECK:    3: [B2.2].~A() (Implicit destructor)
268// CHECK:    4: [B6.4].~A() (Implicit destructor)
269// CHECK:    Preds (1): B4
270// CHECK:    Succs (1): B1
271// CHECK:  [B3]
272// CHECK:    1: [B6.4].~A() (Implicit destructor)
273// CHECK:    T: goto l1;
274// CHECK:    Preds (1): B4
275// CHECK:    Succs (1): B1
276// CHECK:  [B4]
277// CHECK:    1: UV
278// CHECK:    2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)
279// CHECK:    T: if [B4.2]
280// CHECK:    Preds (1): B6
281// CHECK:    Succs (2): B3 B2
282// CHECK:  [B5]
283// CHECK:    1: [B6.4].~A() (Implicit destructor)
284// CHECK:    2: [B6.2].~A() (Implicit destructor)
285// CHECK:    T: goto l0;
286// CHECK:    Preds (1): B6
287// CHECK:    Succs (1): B6
288// CHECK:  [B6]
289// CHECK:   l0:
290// CHECK:    1:  (CXXConstructExpr, class A)
291// CHECK:    2: A b;
292// CHECK:    3:  (CXXConstructExpr, class A)
293// CHECK:    4: A a;
294// CHECK:    5: UV
295// CHECK:    6: [B6.5] (ImplicitCastExpr, LValueToRValue, _Bool)
296// CHECK:    T: if [B6.6]
297// CHECK:    Preds (2): B7 B5
298// CHECK:    Succs (2): B5 B4
299// CHECK:  [B7]
300// CHECK:    1:  (CXXConstructExpr, class A)
301// CHECK:    2: A a;
302// CHECK:    Preds (1): B8
303// CHECK:    Succs (1): B6
304// CHECK:  [B0 (EXIT)]
305// CHECK:    Preds (1): B1
306// CHECK:  [B5 (ENTRY)]
307// CHECK:    Succs (1): B4
308// CHECK:  [B1]
309// CHECK:    1: [B4.6].~A() (Implicit destructor)
310// CHECK:    2: [B4.2].~A() (Implicit destructor)
311// CHECK:    Preds (2): B2 B3
312// CHECK:    Succs (1): B0
313// CHECK:  [B2]
314// CHECK:    1:  (CXXConstructExpr, class A)
315// CHECK:    2: A c;
316// CHECK:    3: [B2.2].~A() (Implicit destructor)
317// CHECK:    Preds (1): B4
318// CHECK:    Succs (1): B1
319// CHECK:  [B3]
320// CHECK:    1:  (CXXConstructExpr, class A)
321// CHECK:    2: A c;
322// CHECK:    3: [B3.2].~A() (Implicit destructor)
323// CHECK:    Preds (1): B4
324// CHECK:    Succs (1): B1
325// CHECK:  [B4]
326// CHECK:    1:  (CXXConstructExpr, class A)
327// CHECK:    2: A a;
328// CHECK:    3: a
329// CHECK:    4: [B4.3] (ImplicitCastExpr, NoOp, const class A)
330// CHECK:    5: [B4.4] (CXXConstructExpr, class A)
331// CHECK:    6: A b = a;
332// CHECK:    7: b
333// CHECK:    8: [B4.7] (ImplicitCastExpr, NoOp, const class A)
334// CHECK:    9: [B4.8].operator int
335// CHECK:   10: [B4.9]()
336// CHECK:   11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int)
337// CHECK:   12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
338// CHECK:    T: if [B4.12]
339// CHECK:    Preds (1): B5
340// CHECK:    Succs (2): B3 B2
341// CHECK:  [B0 (EXIT)]
342// CHECK:    Preds (1): B1
343// CHECK:  [B9 (ENTRY)]
344// CHECK:    Succs (1): B8
345// CHECK:  [B1]
346// CHECK:    1: [B8.6].~A() (Implicit destructor)
347// CHECK:    2:  (CXXConstructExpr, class A)
348// CHECK:    3: A e;
349// CHECK:    4: [B1.3].~A() (Implicit destructor)
350// CHECK:    5: [B8.2].~A() (Implicit destructor)
351// CHECK:    Preds (2): B2 B5
352// CHECK:    Succs (1): B0
353// CHECK:  [B2]
354// CHECK:    1:  (CXXConstructExpr, class A)
355// CHECK:    2: A d;
356// CHECK:    3: [B2.2].~A() (Implicit destructor)
357// CHECK:    4: [B4.2].~A() (Implicit destructor)
358// CHECK:    Preds (1): B4
359// CHECK:    Succs (1): B1
360// CHECK:  [B3]
361// CHECK:    1: return;
362// CHECK:    2: [B4.2].~A() (Implicit destructor)
363// CHECK:    3: [B8.6].~A() (Implicit destructor)
364// CHECK:    4: [B8.2].~A() (Implicit destructor)
365// CHECK:    Preds (1): B4
366// CHECK:    Succs (1): B0
367// CHECK:  [B4]
368// CHECK:    1:  (CXXConstructExpr, class A)
369// CHECK:    2: A c;
370// CHECK:    3: UV
371// CHECK:    4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool)
372// CHECK:    T: if [B4.4]
373// CHECK:    Preds (1): B8
374// CHECK:    Succs (2): B3 B2
375// CHECK:  [B5]
376// CHECK:    1:  (CXXConstructExpr, class A)
377// CHECK:    2: A d;
378// CHECK:    3: [B5.2].~A() (Implicit destructor)
379// CHECK:    4: [B7.2].~A() (Implicit destructor)
380// CHECK:    Preds (1): B7
381// CHECK:    Succs (1): B1
382// CHECK:  [B6]
383// CHECK:    1: return;
384// CHECK:    2: [B7.2].~A() (Implicit destructor)
385// CHECK:    3: [B8.6].~A() (Implicit destructor)
386// CHECK:    4: [B8.2].~A() (Implicit destructor)
387// CHECK:    Preds (1): B7
388// CHECK:    Succs (1): B0
389// CHECK:  [B7]
390// CHECK:    1:  (CXXConstructExpr, class A)
391// CHECK:    2: A c;
392// CHECK:    3: UV
393// CHECK:    4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool)
394// CHECK:    T: if [B7.4]
395// CHECK:    Preds (1): B8
396// CHECK:    Succs (2): B6 B5
397// CHECK:  [B8]
398// CHECK:    1:  (CXXConstructExpr, class A)
399// CHECK:    2: A a;
400// CHECK:    3: a
401// CHECK:    4: [B8.3] (ImplicitCastExpr, NoOp, const class A)
402// CHECK:    5: [B8.4] (CXXConstructExpr, class A)
403// CHECK:    6: A b = a;
404// CHECK:    7: b
405// CHECK:    8: [B8.7] (ImplicitCastExpr, NoOp, const class A)
406// CHECK:    9: [B8.8].operator int
407// CHECK:   10: [B8.9]()
408// CHECK:   11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int)
409// CHECK:   12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
410// CHECK:    T: if [B8.12]
411// CHECK:    Preds (1): B9
412// CHECK:    Succs (2): B7 B4
413// CHECK:  [B0 (EXIT)]
414// CHECK:    Preds (3): B1 B3 B6
415// CHECK:  [B6 (ENTRY)]
416// CHECK:    Succs (1): B5
417// CHECK:  [B1]
418// CHECK:    1: [B4.4].~A() (Implicit destructor)
419// CHECK:    2: [B5.2].~A() (Implicit destructor)
420// CHECK:    Preds (1): B4
421// CHECK:    Succs (1): B0
422// CHECK:  [B2]
423// CHECK:    Preds (1): B3
424// CHECK:    Succs (1): B4
425// CHECK:  [B3]
426// CHECK:    1:  (CXXConstructExpr, class A)
427// CHECK:    2: A c;
428// CHECK:    3: [B3.2].~A() (Implicit destructor)
429// CHECK:    4: [B4.4].~A() (Implicit destructor)
430// CHECK:    Preds (1): B4
431// CHECK:    Succs (1): B2
432// CHECK:  [B4]
433// CHECK:    1: a
434// CHECK:    2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
435// CHECK:    3: [B4.2] (CXXConstructExpr, class A)
436// CHECK:    4: A b = a;
437// CHECK:    5: b
438// CHECK:    6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
439// CHECK:    7: [B4.6].operator int
440// CHECK:    8: [B4.7]()
441// CHECK:    9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
442// CHECK:   10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
443// CHECK:    T: while [B4.10]
444// CHECK:    Preds (2): B2 B5
445// CHECK:    Succs (2): B3 B1
446// CHECK:  [B5]
447// CHECK:    1:  (CXXConstructExpr, class A)
448// CHECK:    2: A a;
449// CHECK:    Preds (1): B6
450// CHECK:    Succs (1): B4
451// CHECK:  [B0 (EXIT)]
452// CHECK:    Preds (1): B1
453// CHECK:  [B12 (ENTRY)]
454// CHECK:    Succs (1): B11
455// CHECK:  [B1]
456// CHECK:    1: [B10.4].~A() (Implicit destructor)
457// CHECK:    2:  (CXXConstructExpr, class A)
458// CHECK:    3: A e;
459// CHECK:    4: [B1.3].~A() (Implicit destructor)
460// CHECK:    5: [B11.2].~A() (Implicit destructor)
461// CHECK:    Preds (2): B8 B10
462// CHECK:    Succs (1): B0
463// CHECK:  [B2]
464// CHECK:    Preds (2): B3 B6
465// CHECK:    Succs (1): B10
466// CHECK:  [B3]
467// CHECK:    1:  (CXXConstructExpr, class A)
468// CHECK:    2: A d;
469// CHECK:    3: [B3.2].~A() (Implicit destructor)
470// CHECK:    4: [B9.2].~A() (Implicit destructor)
471// CHECK:    5: [B10.4].~A() (Implicit destructor)
472// CHECK:    Preds (1): B5
473// CHECK:    Succs (1): B2
474// CHECK:  [B4]
475// CHECK:    1: return;
476// CHECK:    2: [B9.2].~A() (Implicit destructor)
477// CHECK:    3: [B10.4].~A() (Implicit destructor)
478// CHECK:    4: [B11.2].~A() (Implicit destructor)
479// CHECK:    Preds (1): B5
480// CHECK:    Succs (1): B0
481// CHECK:  [B5]
482// CHECK:    1: UV
483// CHECK:    2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
484// CHECK:    T: if [B5.2]
485// CHECK:    Preds (1): B7
486// CHECK:    Succs (2): B4 B3
487// CHECK:  [B6]
488// CHECK:    1: [B9.2].~A() (Implicit destructor)
489// CHECK:    2: [B10.4].~A() (Implicit destructor)
490// CHECK:    T: continue;
491// CHECK:    Preds (1): B7
492// CHECK:    Succs (1): B2
493// CHECK:  [B7]
494// CHECK:    1: UV
495// CHECK:    2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
496// CHECK:    T: if [B7.2]
497// CHECK:    Preds (1): B9
498// CHECK:    Succs (2): B6 B5
499// CHECK:  [B8]
500// CHECK:    1: [B9.2].~A() (Implicit destructor)
501// CHECK:    T: break;
502// CHECK:    Preds (1): B9
503// CHECK:    Succs (1): B1
504// CHECK:  [B9]
505// CHECK:    1:  (CXXConstructExpr, class A)
506// CHECK:    2: A c;
507// CHECK:    3: UV
508// CHECK:    4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
509// CHECK:    T: if [B9.4]
510// CHECK:    Preds (1): B10
511// CHECK:    Succs (2): B8 B7
512// CHECK:  [B10]
513// CHECK:    1: a
514// CHECK:    2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
515// CHECK:    3: [B10.2] (CXXConstructExpr, class A)
516// CHECK:    4: A b = a;
517// CHECK:    5: b
518// CHECK:    6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
519// CHECK:    7: [B10.6].operator int
520// CHECK:    8: [B10.7]()
521// CHECK:    9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
522// CHECK:   10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
523// CHECK:    T: while [B10.10]
524// CHECK:    Preds (2): B2 B11
525// CHECK:    Succs (2): B9 B1
526// CHECK:  [B11]
527// CHECK:    1:  (CXXConstructExpr, class A)
528// CHECK:    2: A a;
529// CHECK:    Preds (1): B12
530// CHECK:    Succs (1): B10
531// CHECK:  [B0 (EXIT)]
532// CHECK:    Preds (2): B1 B4
533// CHECK:  [B4 (ENTRY)]
534// CHECK:    Succs (1): B2
535// CHECK:  [B1]
536// CHECK:    1: UV
537// CHECK:    2: [B1.1] (ImplicitCastExpr, LValueToRValue, _Bool)
538// CHECK:    T: do ... while [B1.2]
539// CHECK:    Preds (1): B2
540// CHECK:    Succs (2): B3 B0
541// CHECK:  [B2]
542// CHECK:    1:  (CXXConstructExpr, class A)
543// CHECK:    2: A a;
544// CHECK:    3: [B2.2].~A() (Implicit destructor)
545// CHECK:    Preds (2): B3 B4
546// CHECK:    Succs (1): B1
547// CHECK:  [B3]
548// CHECK:    Preds (1): B1
549// CHECK:    Succs (1): B2
550// CHECK:  [B0 (EXIT)]
551// CHECK:    Preds (1): B1
552// CHECK:  [B12 (ENTRY)]
553// CHECK:    Succs (1): B11
554// CHECK:  [B1]
555// CHECK:    1:  (CXXConstructExpr, class A)
556// CHECK:    2: A d;
557// CHECK:    3: [B1.2].~A() (Implicit destructor)
558// CHECK:    4: [B11.2].~A() (Implicit destructor)
559// CHECK:    Preds (2): B8 B2
560// CHECK:    Succs (1): B0
561// CHECK:  [B2]
562// CHECK:    1: UV
563// CHECK:    2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)
564// CHECK:    T: do ... while [B2.2]
565// CHECK:    Preds (2): B3 B6
566// CHECK:    Succs (2): B10 B1
567// CHECK:  [B3]
568// CHECK:    1:  (CXXConstructExpr, class A)
569// CHECK:    2: A c;
570// CHECK:    3: [B3.2].~A() (Implicit destructor)
571// CHECK:    4: [B9.2].~A() (Implicit destructor)
572// CHECK:    Preds (1): B5
573// CHECK:    Succs (1): B2
574// CHECK:  [B4]
575// CHECK:    1: return;
576// CHECK:    2: [B9.2].~A() (Implicit destructor)
577// CHECK:    3: [B11.2].~A() (Implicit destructor)
578// CHECK:    Preds (1): B5
579// CHECK:    Succs (1): B0
580// CHECK:  [B5]
581// CHECK:    1: UV
582// CHECK:    2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
583// CHECK:    T: if [B5.2]
584// CHECK:    Preds (1): B7
585// CHECK:    Succs (2): B4 B3
586// CHECK:  [B6]
587// CHECK:    1: [B9.2].~A() (Implicit destructor)
588// CHECK:    T: continue;
589// CHECK:    Preds (1): B7
590// CHECK:    Succs (1): B2
591// CHECK:  [B7]
592// CHECK:    1: UV
593// CHECK:    2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
594// CHECK:    T: if [B7.2]
595// CHECK:    Preds (1): B9
596// CHECK:    Succs (2): B6 B5
597// CHECK:  [B8]
598// CHECK:    1: [B9.2].~A() (Implicit destructor)
599// CHECK:    T: break;
600// CHECK:    Preds (1): B9
601// CHECK:    Succs (1): B1
602// CHECK:  [B9]
603// CHECK:    1:  (CXXConstructExpr, class A)
604// CHECK:    2: A b;
605// CHECK:    3: UV
606// CHECK:    4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
607// CHECK:    T: if [B9.4]
608// CHECK:    Preds (2): B10 B11
609// CHECK:    Succs (2): B8 B7
610// CHECK:  [B10]
611// CHECK:    Preds (1): B2
612// CHECK:    Succs (1): B9
613// CHECK:  [B11]
614// CHECK:    1:  (CXXConstructExpr, class A)
615// CHECK:    2: A a;
616// CHECK:    Preds (1): B12
617// CHECK:    Succs (1): B9
618// CHECK:  [B0 (EXIT)]
619// CHECK:    Preds (2): B1 B4
620// CHECK:  [B4 (ENTRY)]
621// CHECK:    Succs (1): B2
622// CHECK:  [B1]
623// CHECK:    1: [B2.6].~A() (Implicit destructor)
624// CHECK:    2: [B2.2].~A() (Implicit destructor)
625// CHECK:    Preds (2): B3 B2
626// CHECK:    Succs (1): B0
627// CHECK:  [B2]
628// CHECK:    1:  (CXXConstructExpr, class A)
629// CHECK:    2: A a;
630// CHECK:    3: a
631// CHECK:    4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
632// CHECK:    5: [B2.4] (CXXConstructExpr, class A)
633// CHECK:    6: A b = a;
634// CHECK:    7: b
635// CHECK:    8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
636// CHECK:    9: [B2.8].operator int
637// CHECK:   10: [B2.9]()
638// CHECK:   11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
639// CHECK:    T: switch [B2.11]
640// CHECK:    Preds (1): B4
641// CHECK:    Succs (1): B1
642// CHECK:  [B3]
643// CHECK:    1:  (CXXConstructExpr, class A)
644// CHECK:    2: A c;
645// CHECK:    3: [B3.2].~A() (Implicit destructor)
646// CHECK:    Succs (1): B1
647// CHECK:  [B0 (EXIT)]
648// CHECK:    Preds (1): B1
649// CHECK:  [B9 (ENTRY)]
650// CHECK:    Succs (1): B2
651// CHECK:  [B1]
652// CHECK:    1: [B2.6].~A() (Implicit destructor)
653// CHECK:    2:  (CXXConstructExpr, class A)
654// CHECK:    3: A g;
655// CHECK:    4: [B1.3].~A() (Implicit destructor)
656// CHECK:    5: [B2.2].~A() (Implicit destructor)
657// CHECK:    Preds (3): B3 B7 B2
658// CHECK:    Succs (1): B0
659// CHECK:  [B2]
660// CHECK:    1:  (CXXConstructExpr, class A)
661// CHECK:    2: A a;
662// CHECK:    3: a
663// CHECK:    4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
664// CHECK:    5: [B2.4] (CXXConstructExpr, class A)
665// CHECK:    6: A b = a;
666// CHECK:    7: b
667// CHECK:    8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
668// CHECK:    9: [B2.8].operator int
669// CHECK:   10: [B2.9]()
670// CHECK:   11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
671// CHECK:    T: switch [B2.11]
672// CHECK:    Preds (1): B9
673// CHECK:    Succs (3): B3 B8
674// CHECK:      B1
675// CHECK:  [B3]
676// CHECK:   case 1:
677// CHECK:    T: break;
678// CHECK:    Preds (2): B2 B4
679// CHECK:    Succs (1): B1
680// CHECK:  [B4]
681// CHECK:    1:  (CXXConstructExpr, class A)
682// CHECK:    2: A f;
683// CHECK:    3: [B4.2].~A() (Implicit destructor)
684// CHECK:    4: [B8.2].~A() (Implicit destructor)
685// CHECK:    Preds (1): B6
686// CHECK:    Succs (1): B3
687// CHECK:  [B5]
688// CHECK:    1: return;
689// CHECK:    2: [B8.2].~A() (Implicit destructor)
690// CHECK:    3: [B2.6].~A() (Implicit destructor)
691// CHECK:    4: [B2.2].~A() (Implicit destructor)
692// CHECK:    Preds (1): B6
693// CHECK:    Succs (1): B0
694// CHECK:  [B6]
695// CHECK:    1: UV
696// CHECK:    2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
697// CHECK:    T: if [B6.2]
698// CHECK:    Preds (1): B8
699// CHECK:    Succs (2): B5 B4
700// CHECK:  [B7]
701// CHECK:    1: [B8.2].~A() (Implicit destructor)
702// CHECK:    T: break;
703// CHECK:    Preds (1): B8
704// CHECK:    Succs (1): B1
705// CHECK:  [B8]
706// CHECK:   case 0:
707// CHECK:    1:  (CXXConstructExpr, class A)
708// CHECK:    2: A c;
709// CHECK:    3: UV
710// CHECK:    4: [B8.3] (ImplicitCastExpr, LValueToRValue, _Bool)
711// CHECK:    T: if [B8.4]
712// CHECK:    Preds (1): B2
713// CHECK:    Succs (2): B7 B6
714// CHECK:  [B0 (EXIT)]
715// CHECK:    Preds (2): B1 B5
716// CHECK:  [B6 (ENTRY)]
717// CHECK:    Succs (1): B5
718// CHECK:  [B1]
719// CHECK:    1: [B4.4].~A() (Implicit destructor)
720// CHECK:    2: [B5.2].~A() (Implicit destructor)
721// CHECK:    Preds (1): B4
722// CHECK:    Succs (1): B0
723// CHECK:  [B2]
724// CHECK:    Preds (1): B3
725// CHECK:    Succs (1): B4
726// CHECK:  [B3]
727// CHECK:    1:  (CXXConstructExpr, class A)
728// CHECK:    2: A c;
729// CHECK:    3: [B3.2].~A() (Implicit destructor)
730// CHECK:    4: [B4.4].~A() (Implicit destructor)
731// CHECK:    Preds (1): B4
732// CHECK:    Succs (1): B2
733// CHECK:  [B4]
734// CHECK:    1: a
735// CHECK:    2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
736// CHECK:    3: [B4.2] (CXXConstructExpr, class A)
737// CHECK:    4: A b = a;
738// CHECK:    5: b
739// CHECK:    6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
740// CHECK:    7: [B4.6].operator int
741// CHECK:    8: [B4.7]()
742// CHECK:    9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
743// CHECK:   10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
744// CHECK:    T: for (...; [B4.10]; )
745// CHECK:    Preds (2): B2 B5
746// CHECK:    Succs (2): B3 B1
747// CHECK:  [B5]
748// CHECK:    1:  (CXXConstructExpr, class A)
749// CHECK:    2: A a;
750// CHECK:    Preds (1): B6
751// CHECK:    Succs (1): B4
752// CHECK:  [B0 (EXIT)]
753// CHECK:    Preds (1): B1
754// CHECK:  [B12 (ENTRY)]
755// CHECK:    Succs (1): B11
756// CHECK:  [B1]
757// CHECK:    1: [B10.4].~A() (Implicit destructor)
758// CHECK:    2: [B11.4].~A() (Implicit destructor)
759// CHECK:    3:  (CXXConstructExpr, class A)
760// CHECK:    4: A f;
761// CHECK:    5: [B1.4].~A() (Implicit destructor)
762// CHECK:    6: [B11.2].~A() (Implicit destructor)
763// CHECK:    Preds (2): B8 B10
764// CHECK:    Succs (1): B0
765// CHECK:  [B2]
766// CHECK:    Preds (2): B3 B6
767// CHECK:    Succs (1): B10
768// CHECK:  [B3]
769// CHECK:    1:  (CXXConstructExpr, class A)
770// CHECK:    2: A e;
771// CHECK:    3: [B3.2].~A() (Implicit destructor)
772// CHECK:    4: [B9.2].~A() (Implicit destructor)
773// CHECK:    5: [B10.4].~A() (Implicit destructor)
774// CHECK:    Preds (1): B5
775// CHECK:    Succs (1): B2
776// CHECK:  [B4]
777// CHECK:    1: return;
778// CHECK:    2: [B9.2].~A() (Implicit destructor)
779// CHECK:    3: [B10.4].~A() (Implicit destructor)
780// CHECK:    4: [B11.4].~A() (Implicit destructor)
781// CHECK:    5: [B11.2].~A() (Implicit destructor)
782// CHECK:    Preds (1): B5
783// CHECK:    Succs (1): B0
784// CHECK:  [B5]
785// CHECK:    1: UV
786// CHECK:    2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
787// CHECK:    T: if [B5.2]
788// CHECK:    Preds (1): B7
789// CHECK:    Succs (2): B4 B3
790// CHECK:  [B6]
791// CHECK:    1: [B9.2].~A() (Implicit destructor)
792// CHECK:    T: continue;
793// CHECK:    Preds (1): B7
794// CHECK:    Succs (1): B2
795// CHECK:  [B7]
796// CHECK:    1: UV
797// CHECK:    2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
798// CHECK:    T: if [B7.2]
799// CHECK:    Preds (1): B9
800// CHECK:    Succs (2): B6 B5
801// CHECK:  [B8]
802// CHECK:    1: [B9.2].~A() (Implicit destructor)
803// CHECK:    T: break;
804// CHECK:    Preds (1): B9
805// CHECK:    Succs (1): B1
806// CHECK:  [B9]
807// CHECK:    1:  (CXXConstructExpr, class A)
808// CHECK:    2: A d;
809// CHECK:    3: UV
810// CHECK:    4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
811// CHECK:    T: if [B9.4]
812// CHECK:    Preds (1): B10
813// CHECK:    Succs (2): B8 B7
814// CHECK:  [B10]
815// CHECK:    1: b
816// CHECK:    2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
817// CHECK:    3: [B10.2] (CXXConstructExpr, class A)
818// CHECK:    4: A c = b;
819// CHECK:    5: c
820// CHECK:    6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
821// CHECK:    7: [B10.6].operator int
822// CHECK:    8: [B10.7]()
823// CHECK:    9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
824// CHECK:   10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
825// CHECK:    T: for (...; [B10.10]; )
826// CHECK:    Preds (2): B2 B11
827// CHECK:    Succs (2): B9 B1
828// CHECK:  [B11]
829// CHECK:    1:  (CXXConstructExpr, class A)
830// CHECK:    2: A a;
831// CHECK:    3:  (CXXConstructExpr, class A)
832// CHECK:    4: A b;
833// CHECK:    Preds (1): B12
834// CHECK:    Succs (1): B10
835// CHECK:  [B0 (EXIT)]
836// CHECK:    Preds (2): B1 B4
837// CHECK:  [B3 (ENTRY)]
838// CHECK:    Succs (1): B0
839// CHECK:  [B1]
840// CHECK:    T: try ...
841// CHECK:    Succs (2): B2 B0
842// CHECK:  [B2]
843// CHECK:   catch (const A &e):
844// CHECK:    1: catch (const A &e) {
845// CHECK: }
846// CHECK:    Preds (1): B1
847// CHECK:    Succs (1): B0
848// CHECK:  [B0 (EXIT)]
849// CHECK:    Preds (3): B2 B1 B3
850// CHECK:  [B3 (ENTRY)]
851// CHECK:    Succs (1): B0
852// CHECK:  [B1]
853// CHECK:    T: try ...
854// CHECK:    Succs (2): B2 B0
855// CHECK:  [B2]
856// CHECK:   catch (A e):
857// CHECK:    1: catch (A e) {
858// CHECK: }
859// CHECK:    2: [B2.1].~A() (Implicit destructor)
860// CHECK:    Preds (1): B1
861// CHECK:    Succs (1): B0
862// CHECK:  [B0 (EXIT)]
863// CHECK:    Preds (3): B2 B1 B3
864
865