auto-obj-dtors-cfg-output.cpp revision 682060c5d95f6e4f79536013781ab0870cdd3850
1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG -cfg-add-implicit-dtors %s 2>&1 | FileCheck %s
2// XPASS: *
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:  [B2 (ENTRY)]
159// CHECK:    Succs (1): B1
160// CHECK:  [B1]
161// CHECK:    1:  (CXXConstructExpr, class A)
162// CHECK:    2: A a;
163// CHECK:    3: a
164// CHECK:    4: [B1.3] (ImplicitCastExpr, NoOp, const class A)
165// CHECK:    5: const A &b = a;
166// CHECK:    6: A() (CXXConstructExpr, class A)
167// CHECK:    7: [B1.6] (BindTemporary)
168// CHECK:    8: [B1.7] (ImplicitCastExpr, NoOp, const class A)
169// CHECK:    9: [B1.8]
170// CHECK:   10: const A &c = A();
171// CHECK:   11: [B1.10].~A() (Implicit destructor)
172// CHECK:   12: [B1.2].~A() (Implicit destructor)
173// CHECK:    Preds (1): B2
174// CHECK:    Succs (1): B0
175// CHECK:  [B0 (EXIT)]
176// CHECK:    Preds (1): B1
177// CHECK:  [B2 (ENTRY)]
178// CHECK:    Succs (1): B1
179// CHECK:  [B1]
180// CHECK:    1:  (CXXConstructExpr, class A [2])
181// CHECK:    2: A a[2];
182// CHECK:    3:  (CXXConstructExpr, class A [0])
183// CHECK:    4: A b[0];
184// CHECK:    5: [B1.2].~A() (Implicit destructor)
185// CHECK:    Preds (1): B2
186// CHECK:    Succs (1): B0
187// CHECK:  [B0 (EXIT)]
188// CHECK:    Preds (1): B1
189// CHECK:  [B2 (ENTRY)]
190// CHECK:    Succs (1): B1
191// CHECK:  [B1]
192// CHECK:    1:  (CXXConstructExpr, class A)
193// CHECK:    2: A a;
194// CHECK:    3:  (CXXConstructExpr, class A)
195// CHECK:    4: A c;
196// CHECK:    5:  (CXXConstructExpr, class A)
197// CHECK:    6: A d;
198// CHECK:    7: [B1.6].~A() (Implicit destructor)
199// CHECK:    8: [B1.4].~A() (Implicit destructor)
200// CHECK:    9:  (CXXConstructExpr, class A)
201// CHECK:   10: A b;
202// CHECK:   11: [B1.10].~A() (Implicit destructor)
203// CHECK:   12: [B1.2].~A() (Implicit destructor)
204// CHECK:    Preds (1): B2
205// CHECK:    Succs (1): B0
206// CHECK:  [B0 (EXIT)]
207// CHECK:    Preds (1): B1
208// CHECK:  [B4 (ENTRY)]
209// CHECK:    Succs (1): B3
210// CHECK:  [B1]
211// CHECK:    1:  (CXXConstructExpr, class A)
212// CHECK:    2: A c;
213// CHECK:    3: [B1.2].~A() (Implicit destructor)
214// CHECK:    4: [B3.4].~A() (Implicit destructor)
215// CHECK:    5: [B3.2].~A() (Implicit destructor)
216// CHECK:    Preds (1): B3
217// CHECK:    Succs (1): B0
218// CHECK:  [B2]
219// CHECK:    1: return;
220// CHECK:    2: [B3.4].~A() (Implicit destructor)
221// CHECK:    3: [B3.2].~A() (Implicit destructor)
222// CHECK:    Preds (1): B3
223// CHECK:    Succs (1): B0
224// CHECK:  [B3]
225// CHECK:    1:  (CXXConstructExpr, class A)
226// CHECK:    2: A a;
227// CHECK:    3:  (CXXConstructExpr, class A)
228// CHECK:    4: A b;
229// CHECK:    5: UV
230// CHECK:    6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool)
231// CHECK:    T: if [B3.6]
232// CHECK:    Preds (1): B4
233// CHECK:    Succs (2): B2 B1
234// CHECK:  [B0 (EXIT)]
235// CHECK:    Preds (2): B1 B2
236// CHECK:  [B8 (ENTRY)]
237// CHECK:    Succs (1): B7
238// CHECK:  [B1]
239// CHECK:   l1:
240// CHECK:    1:  (CXXConstructExpr, class A)
241// CHECK:    2: A c;
242// CHECK:    3: [B1.2].~A() (Implicit destructor)
243// CHECK:    4: [B6.2].~A() (Implicit destructor)
244// CHECK:    5: [B7.2].~A() (Implicit destructor)
245// CHECK:    Preds (2): B2 B3
246// CHECK:    Succs (1): B0
247// CHECK:  [B2]
248// CHECK:    1:  (CXXConstructExpr, class A)
249// CHECK:    2: A b;
250// CHECK:    3: [B2.2].~A() (Implicit destructor)
251// CHECK:    4: [B6.4].~A() (Implicit destructor)
252// CHECK:    Preds (1): B4
253// CHECK:    Succs (1): B1
254// CHECK:  [B3]
255// CHECK:    1: [B6.4].~A() (Implicit destructor)
256// CHECK:    T: goto l1;
257// CHECK:    Preds (1): B4
258// CHECK:    Succs (1): B1
259// CHECK:  [B4]
260// CHECK:    1: UV
261// CHECK:    2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)
262// CHECK:    T: if [B4.2]
263// CHECK:    Preds (1): B6
264// CHECK:    Succs (2): B3 B2
265// CHECK:  [B5]
266// CHECK:    1: [B6.4].~A() (Implicit destructor)
267// CHECK:    2: [B6.2].~A() (Implicit destructor)
268// CHECK:    T: goto l0;
269// CHECK:    Preds (1): B6
270// CHECK:    Succs (1): B6
271// CHECK:  [B6]
272// CHECK:   l0:
273// CHECK:    1:  (CXXConstructExpr, class A)
274// CHECK:    2: A b;
275// CHECK:    3:  (CXXConstructExpr, class A)
276// CHECK:    4: A a;
277// CHECK:    5: UV
278// CHECK:    6: [B6.5] (ImplicitCastExpr, LValueToRValue, _Bool)
279// CHECK:    T: if [B6.6]
280// CHECK:    Preds (2): B7 B5
281// CHECK:    Succs (2): B5 B4
282// CHECK:  [B7]
283// CHECK:    1:  (CXXConstructExpr, class A)
284// CHECK:    2: A a;
285// CHECK:    Preds (1): B8
286// CHECK:    Succs (1): B6
287// CHECK:  [B0 (EXIT)]
288// CHECK:    Preds (1): B1
289// CHECK:  [B5 (ENTRY)]
290// CHECK:    Succs (1): B4
291// CHECK:  [B1]
292// CHECK:    1: [B4.6].~A() (Implicit destructor)
293// CHECK:    2: [B4.2].~A() (Implicit destructor)
294// CHECK:    Preds (2): B2 B3
295// CHECK:    Succs (1): B0
296// CHECK:  [B2]
297// CHECK:    1:  (CXXConstructExpr, class A)
298// CHECK:    2: A c;
299// CHECK:    3: [B2.2].~A() (Implicit destructor)
300// CHECK:    Preds (1): B4
301// CHECK:    Succs (1): B1
302// CHECK:  [B3]
303// CHECK:    1:  (CXXConstructExpr, class A)
304// CHECK:    2: A c;
305// CHECK:    3: [B3.2].~A() (Implicit destructor)
306// CHECK:    Preds (1): B4
307// CHECK:    Succs (1): B1
308// CHECK:  [B4]
309// CHECK:    1:  (CXXConstructExpr, class A)
310// CHECK:    2: A a;
311// CHECK:    3: a
312// CHECK:    4: [B4.3] (ImplicitCastExpr, NoOp, const class A)
313// CHECK:    5: [B4.4] (CXXConstructExpr, class A)
314// CHECK:    6: A b = a;
315// CHECK:    7: b
316// CHECK:    8: [B4.7] (ImplicitCastExpr, NoOp, const class A)
317// CHECK:    9: [B4.8].operator int
318// CHECK:   10: [B4.9]()
319// CHECK:   11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int)
320// CHECK:   12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
321// CHECK:    T: if [B4.12]
322// CHECK:    Preds (1): B5
323// CHECK:    Succs (2): B3 B2
324// CHECK:  [B0 (EXIT)]
325// CHECK:    Preds (1): B1
326// CHECK:  [B9 (ENTRY)]
327// CHECK:    Succs (1): B8
328// CHECK:  [B1]
329// CHECK:    1: [B8.6].~A() (Implicit destructor)
330// CHECK:    2:  (CXXConstructExpr, class A)
331// CHECK:    3: A e;
332// CHECK:    4: [B1.3].~A() (Implicit destructor)
333// CHECK:    5: [B8.2].~A() (Implicit destructor)
334// CHECK:    Preds (2): B2 B5
335// CHECK:    Succs (1): B0
336// CHECK:  [B2]
337// CHECK:    1:  (CXXConstructExpr, class A)
338// CHECK:    2: A d;
339// CHECK:    3: [B2.2].~A() (Implicit destructor)
340// CHECK:    4: [B4.2].~A() (Implicit destructor)
341// CHECK:    Preds (1): B4
342// CHECK:    Succs (1): B1
343// CHECK:  [B3]
344// CHECK:    1: return;
345// CHECK:    2: [B4.2].~A() (Implicit destructor)
346// CHECK:    3: [B8.6].~A() (Implicit destructor)
347// CHECK:    4: [B8.2].~A() (Implicit destructor)
348// CHECK:    Preds (1): B4
349// CHECK:    Succs (1): B0
350// CHECK:  [B4]
351// CHECK:    1:  (CXXConstructExpr, class A)
352// CHECK:    2: A c;
353// CHECK:    3: UV
354// CHECK:    4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool)
355// CHECK:    T: if [B4.4]
356// CHECK:    Preds (1): B8
357// CHECK:    Succs (2): B3 B2
358// CHECK:  [B5]
359// CHECK:    1:  (CXXConstructExpr, class A)
360// CHECK:    2: A d;
361// CHECK:    3: [B5.2].~A() (Implicit destructor)
362// CHECK:    4: [B7.2].~A() (Implicit destructor)
363// CHECK:    Preds (1): B7
364// CHECK:    Succs (1): B1
365// CHECK:  [B6]
366// CHECK:    1: return;
367// CHECK:    2: [B7.2].~A() (Implicit destructor)
368// CHECK:    3: [B8.6].~A() (Implicit destructor)
369// CHECK:    4: [B8.2].~A() (Implicit destructor)
370// CHECK:    Preds (1): B7
371// CHECK:    Succs (1): B0
372// CHECK:  [B7]
373// CHECK:    1:  (CXXConstructExpr, class A)
374// CHECK:    2: A c;
375// CHECK:    3: UV
376// CHECK:    4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool)
377// CHECK:    T: if [B7.4]
378// CHECK:    Preds (1): B8
379// CHECK:    Succs (2): B6 B5
380// CHECK:  [B8]
381// CHECK:    1:  (CXXConstructExpr, class A)
382// CHECK:    2: A a;
383// CHECK:    3: a
384// CHECK:    4: [B8.3] (ImplicitCastExpr, NoOp, const class A)
385// CHECK:    5: [B8.4] (CXXConstructExpr, class A)
386// CHECK:    6: A b = a;
387// CHECK:    7: b
388// CHECK:    8: [B8.7] (ImplicitCastExpr, NoOp, const class A)
389// CHECK:    9: [B8.8].operator int
390// CHECK:   10: [B8.9]()
391// CHECK:   11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int)
392// CHECK:   12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
393// CHECK:    T: if [B8.12]
394// CHECK:    Preds (1): B9
395// CHECK:    Succs (2): B7 B4
396// CHECK:  [B0 (EXIT)]
397// CHECK:    Preds (3): B1 B3 B6
398// CHECK:  [B6 (ENTRY)]
399// CHECK:    Succs (1): B5
400// CHECK:  [B1]
401// CHECK:    1: [B2.4].~A() (Implicit destructor)
402// CHECK:    2: [B5.2].~A() (Implicit destructor)
403// CHECK:    Preds (1): B2
404// CHECK:    Succs (1): B0
405// CHECK:  [B2]
406// CHECK:    1: a
407// CHECK:    2: [B2.1] (ImplicitCastExpr, NoOp, const class A)
408// CHECK:    3: [B2.2] (CXXConstructExpr, class A)
409// CHECK:    4: A b = a;
410// CHECK:    5: b
411// CHECK:    6: [B2.5] (ImplicitCastExpr, NoOp, const class A)
412// CHECK:    7: [B2.6].operator int
413// CHECK:    8: [B2.7]()
414// CHECK:    9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, int)
415// CHECK:   10: [B2.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
416// CHECK:    T: while [B2.10]
417// CHECK:    Preds (2): B3 B5
418// CHECK:    Succs (2): B4 B1
419// CHECK:  [B3]
420// CHECK:    Preds (1): B4
421// CHECK:    Succs (1): B2
422// CHECK:  [B4]
423// CHECK:    1:  (CXXConstructExpr, class A)
424// CHECK:    2: A c;
425// CHECK:    3: [B4.2].~A() (Implicit destructor)
426// CHECK:    4: [B2.4].~A() (Implicit destructor)
427// CHECK:    Preds (1): B2
428// CHECK:    Succs (1): B3
429// CHECK:  [B5]
430// CHECK:    1:  (CXXConstructExpr, class A)
431// CHECK:    2: A a;
432// CHECK:    Preds (1): B6
433// CHECK:    Succs (1): B2
434// CHECK:  [B0 (EXIT)]
435// CHECK:    Preds (1): B1
436// CHECK:  [B12 (ENTRY)]
437// CHECK:    Succs (1): B11
438// CHECK:  [B1]
439// CHECK:    1: [B2.4].~A() (Implicit destructor)
440// CHECK:    2:  (CXXConstructExpr, class A)
441// CHECK:    3: A e;
442// CHECK:    4: [B1.3].~A() (Implicit destructor)
443// CHECK:    5: [B11.2].~A() (Implicit destructor)
444// CHECK:    Preds (2): B9 B2
445// CHECK:    Succs (1): B0
446// CHECK:  [B2]
447// CHECK:    1: a
448// CHECK:    2: [B2.1] (ImplicitCastExpr, NoOp, const class A)
449// CHECK:    3: [B2.2] (CXXConstructExpr, class A)
450// CHECK:    4: A b = a;
451// CHECK:    5: b
452// CHECK:    6: [B2.5] (ImplicitCastExpr, NoOp, const class A)
453// CHECK:    7: [B2.6].operator int
454// CHECK:    8: [B2.7]()
455// CHECK:    9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, int)
456// CHECK:   10: [B2.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
457// CHECK:    T: while [B2.10]
458// CHECK:    Preds (2): B3 B11
459// CHECK:    Succs (2): B10 B1
460// CHECK:  [B3]
461// CHECK:    Preds (2): B4 B7
462// CHECK:    Succs (1): B2
463// CHECK:  [B4]
464// CHECK:    1:  (CXXConstructExpr, class A)
465// CHECK:    2: A d;
466// CHECK:    3: [B4.2].~A() (Implicit destructor)
467// CHECK:    4: [B10.2].~A() (Implicit destructor)
468// CHECK:    5: [B2.4].~A() (Implicit destructor)
469// CHECK:    Preds (1): B6
470// CHECK:    Succs (1): B3
471// CHECK:  [B5]
472// CHECK:    1: return;
473// CHECK:    2: [B10.2].~A() (Implicit destructor)
474// CHECK:    3: [B2.4].~A() (Implicit destructor)
475// CHECK:    4: [B11.2].~A() (Implicit destructor)
476// CHECK:    Preds (1): B6
477// CHECK:    Succs (1): B0
478// CHECK:  [B6]
479// CHECK:    1: UV
480// CHECK:    2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
481// CHECK:    T: if [B6.2]
482// CHECK:    Preds (1): B8
483// CHECK:    Succs (2): B5 B4
484// CHECK:  [B7]
485// CHECK:    1: [B10.2].~A() (Implicit destructor)
486// CHECK:    2: [B2.4].~A() (Implicit destructor)
487// CHECK:    T: continue;
488// CHECK:    Preds (1): B8
489// CHECK:    Succs (1): B3
490// CHECK:  [B8]
491// CHECK:    1: UV
492// CHECK:    2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
493// CHECK:    T: if [B8.2]
494// CHECK:    Preds (1): B10
495// CHECK:    Succs (2): B7 B6
496// CHECK:  [B9]
497// CHECK:    1: [B10.2].~A() (Implicit destructor)
498// CHECK:    T: break;
499// CHECK:    Preds (1): B10
500// CHECK:    Succs (1): B1
501// CHECK:  [B10]
502// CHECK:    1:  (CXXConstructExpr, class A)
503// CHECK:    2: A c;
504// CHECK:    3: UV
505// CHECK:    4: [B10.3] (ImplicitCastExpr, LValueToRValue, _Bool)
506// CHECK:    T: if [B10.4]
507// CHECK:    Preds (1): B2
508// CHECK:    Succs (2): B9 B8
509// CHECK:  [B11]
510// CHECK:    1:  (CXXConstructExpr, class A)
511// CHECK:    2: A a;
512// CHECK:    Preds (1): B12
513// CHECK:    Succs (1): B2
514// CHECK:  [B0 (EXIT)]
515// CHECK:    Preds (2): B1 B5
516// CHECK:  [B4 (ENTRY)]
517// CHECK:    Succs (1): B2
518// CHECK:  [B1]
519// CHECK:    1: UV
520// CHECK:    2: [B1.1] (ImplicitCastExpr, LValueToRValue, _Bool)
521// CHECK:    T: do ... while [B1.2]
522// CHECK:    Preds (1): B2
523// CHECK:    Succs (2): B3 B0
524// CHECK:  [B2]
525// CHECK:    1:  (CXXConstructExpr, class A)
526// CHECK:    2: A a;
527// CHECK:    3: [B2.2].~A() (Implicit destructor)
528// CHECK:    Preds (2): B3 B4
529// CHECK:    Succs (1): B1
530// CHECK:  [B3]
531// CHECK:    Preds (1): B1
532// CHECK:    Succs (1): B2
533// CHECK:  [B0 (EXIT)]
534// CHECK:    Preds (1): B1
535// CHECK:  [B12 (ENTRY)]
536// CHECK:    Succs (1): B11
537// CHECK:  [B1]
538// CHECK:    1:  (CXXConstructExpr, class A)
539// CHECK:    2: A d;
540// CHECK:    3: [B1.2].~A() (Implicit destructor)
541// CHECK:    4: [B11.2].~A() (Implicit destructor)
542// CHECK:    Preds (2): B8 B2
543// CHECK:    Succs (1): B0
544// CHECK:  [B2]
545// CHECK:    1: UV
546// CHECK:    2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)
547// CHECK:    T: do ... while [B2.2]
548// CHECK:    Preds (2): B3 B6
549// CHECK:    Succs (2): B10 B1
550// CHECK:  [B3]
551// CHECK:    1:  (CXXConstructExpr, class A)
552// CHECK:    2: A c;
553// CHECK:    3: [B3.2].~A() (Implicit destructor)
554// CHECK:    4: [B9.2].~A() (Implicit destructor)
555// CHECK:    Preds (1): B5
556// CHECK:    Succs (1): B2
557// CHECK:  [B4]
558// CHECK:    1: return;
559// CHECK:    2: [B9.2].~A() (Implicit destructor)
560// CHECK:    3: [B11.2].~A() (Implicit destructor)
561// CHECK:    Preds (1): B5
562// CHECK:    Succs (1): B0
563// CHECK:  [B5]
564// CHECK:    1: UV
565// CHECK:    2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
566// CHECK:    T: if [B5.2]
567// CHECK:    Preds (1): B7
568// CHECK:    Succs (2): B4 B3
569// CHECK:  [B6]
570// CHECK:    1: [B9.2].~A() (Implicit destructor)
571// CHECK:    T: continue;
572// CHECK:    Preds (1): B7
573// CHECK:    Succs (1): B2
574// CHECK:  [B7]
575// CHECK:    1: UV
576// CHECK:    2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
577// CHECK:    T: if [B7.2]
578// CHECK:    Preds (1): B9
579// CHECK:    Succs (2): B6 B5
580// CHECK:  [B8]
581// CHECK:    1: [B9.2].~A() (Implicit destructor)
582// CHECK:    T: break;
583// CHECK:    Preds (1): B9
584// CHECK:    Succs (1): B1
585// CHECK:  [B9]
586// CHECK:    1:  (CXXConstructExpr, class A)
587// CHECK:    2: A b;
588// CHECK:    3: UV
589// CHECK:    4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
590// CHECK:    T: if [B9.4]
591// CHECK:    Preds (2): B10 B11
592// CHECK:    Succs (2): B8 B7
593// CHECK:  [B10]
594// CHECK:    Preds (1): B2
595// CHECK:    Succs (1): B9
596// CHECK:  [B11]
597// CHECK:    1:  (CXXConstructExpr, class A)
598// CHECK:    2: A a;
599// CHECK:    Preds (1): B12
600// CHECK:    Succs (1): B9
601// CHECK:  [B0 (EXIT)]
602// CHECK:    Preds (2): B1 B4
603// CHECK:  [B4 (ENTRY)]
604// CHECK:    Succs (1): B2
605// CHECK:  [B1]
606// CHECK:    1: [B2.6].~A() (Implicit destructor)
607// CHECK:    2: [B2.2].~A() (Implicit destructor)
608// CHECK:    Preds (2): B3 B2
609// CHECK:    Succs (1): B0
610// CHECK:  [B2]
611// CHECK:    1:  (CXXConstructExpr, class A)
612// CHECK:    2: A a;
613// CHECK:    3: a
614// CHECK:    4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
615// CHECK:    5: [B2.4] (CXXConstructExpr, class A)
616// CHECK:    6: A b = a;
617// CHECK:    7: b
618// CHECK:    8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
619// CHECK:    9: [B2.8].operator int
620// CHECK:   10: [B2.9]()
621// CHECK:   11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
622// CHECK:    T: switch [B2.11]
623// CHECK:    Preds (1): B4
624// CHECK:    Succs (1): B1
625// CHECK:  [B3]
626// CHECK:    1:  (CXXConstructExpr, class A)
627// CHECK:    2: A c;
628// CHECK:    3: [B3.2].~A() (Implicit destructor)
629// CHECK:    Succs (1): B1
630// CHECK:  [B0 (EXIT)]
631// CHECK:    Preds (1): B1
632// CHECK:  [B9 (ENTRY)]
633// CHECK:    Succs (1): B2
634// CHECK:  [B1]
635// CHECK:    1: [B2.6].~A() (Implicit destructor)
636// CHECK:    2:  (CXXConstructExpr, class A)
637// CHECK:    3: A g;
638// CHECK:    4: [B1.3].~A() (Implicit destructor)
639// CHECK:    5: [B2.2].~A() (Implicit destructor)
640// CHECK:    Preds (3): B3 B7 B2
641// CHECK:    Succs (1): B0
642// CHECK:  [B2]
643// CHECK:    1:  (CXXConstructExpr, class A)
644// CHECK:    2: A a;
645// CHECK:    3: a
646// CHECK:    4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
647// CHECK:    5: [B2.4] (CXXConstructExpr, class A)
648// CHECK:    6: A b = a;
649// CHECK:    7: b
650// CHECK:    8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
651// CHECK:    9: [B2.8].operator int
652// CHECK:   10: [B2.9]()
653// CHECK:   11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
654// CHECK:    T: switch [B2.11]
655// CHECK:    Preds (1): B9
656// CHECK:    Succs (3): B3 B8
657// CHECK:      B1
658// CHECK:  [B3]
659// CHECK:   case 1:
660// CHECK:    T: break;
661// CHECK:    Preds (2): B2 B4
662// CHECK:    Succs (1): B1
663// CHECK:  [B4]
664// CHECK:    1:  (CXXConstructExpr, class A)
665// CHECK:    2: A f;
666// CHECK:    3: [B4.2].~A() (Implicit destructor)
667// CHECK:    4: [B8.2].~A() (Implicit destructor)
668// CHECK:    Preds (1): B6
669// CHECK:    Succs (1): B3
670// CHECK:  [B5]
671// CHECK:    1: return;
672// CHECK:    2: [B8.2].~A() (Implicit destructor)
673// CHECK:    3: [B2.6].~A() (Implicit destructor)
674// CHECK:    4: [B2.2].~A() (Implicit destructor)
675// CHECK:    Preds (1): B6
676// CHECK:    Succs (1): B0
677// CHECK:  [B6]
678// CHECK:    1: UV
679// CHECK:    2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
680// CHECK:    T: if [B6.2]
681// CHECK:    Preds (1): B8
682// CHECK:    Succs (2): B5 B4
683// CHECK:  [B7]
684// CHECK:    1: [B8.2].~A() (Implicit destructor)
685// CHECK:    T: break;
686// CHECK:    Preds (1): B8
687// CHECK:    Succs (1): B1
688// CHECK:  [B8]
689// CHECK:   case 0:
690// CHECK:    1:  (CXXConstructExpr, class A)
691// CHECK:    2: A c;
692// CHECK:    3: UV
693// CHECK:    4: [B8.3] (ImplicitCastExpr, LValueToRValue, _Bool)
694// CHECK:    T: if [B8.4]
695// CHECK:    Preds (1): B2
696// CHECK:    Succs (2): B7 B6
697// CHECK:  [B0 (EXIT)]
698// CHECK:    Preds (2): B1 B5
699// CHECK:  [B6 (ENTRY)]
700// CHECK:    Succs (1): B5
701// CHECK:  [B1]
702// CHECK:    1: [B2.4].~A() (Implicit destructor)
703// CHECK:    2: [B5.2].~A() (Implicit destructor)
704// CHECK:    Preds (1): B2
705// CHECK:    Succs (1): B0
706// CHECK:  [B2]
707// CHECK:    1: a
708// CHECK:    2: [B2.1] (ImplicitCastExpr, NoOp, const class A)
709// CHECK:    3: [B2.2] (CXXConstructExpr, class A)
710// CHECK:    4: A b = a;
711// CHECK:    5: b
712// CHECK:    6: [B2.5] (ImplicitCastExpr, NoOp, const class A)
713// CHECK:    7: [B2.6].operator int
714// CHECK:    8: [B2.7]()
715// CHECK:    9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, int)
716// CHECK:   10: [B2.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
717// CHECK:    T: for (...; [B2.10]; )
718// CHECK:    Preds (2): B3 B5
719// CHECK:    Succs (2): B4 B1
720// CHECK:  [B3]
721// CHECK:    1: [B2.4].~A() (Implicit destructor)
722// CHECK:    Preds (1): B4
723// CHECK:    Succs (1): B2
724// CHECK:  [B4]
725// CHECK:    1:  (CXXConstructExpr, class A)
726// CHECK:    2: A c;
727// CHECK:    3: [B4.2].~A() (Implicit destructor)
728// CHECK:    Preds (1): B2
729// CHECK:    Succs (1): B3
730// CHECK:  [B5]
731// CHECK:    1:  (CXXConstructExpr, class A)
732// CHECK:    2: A a;
733// CHECK:    Preds (1): B6
734// CHECK:    Succs (1): B2
735// CHECK:  [B0 (EXIT)]
736// CHECK:    Preds (1): B1
737// CHECK:  [B12 (ENTRY)]
738// CHECK:    Succs (1): B11
739// CHECK:  [B1]
740// CHECK:    1: [B2.4].~A() (Implicit destructor)
741// CHECK:    2: [B11.4].~A() (Implicit destructor)
742// CHECK:    3:  (CXXConstructExpr, class A)
743// CHECK:    4: A f;
744// CHECK:    5: [B1.4].~A() (Implicit destructor)
745// CHECK:    6: [B11.2].~A() (Implicit destructor)
746// CHECK:    Preds (2): B9 B2
747// CHECK:    Succs (1): B0
748// CHECK:  [B2]
749// CHECK:    1: b
750// CHECK:    2: [B2.1] (ImplicitCastExpr, NoOp, const class A)
751// CHECK:    3: [B2.2] (CXXConstructExpr, class A)
752// CHECK:    4: A c = b;
753// CHECK:    5: c
754// CHECK:    6: [B2.5] (ImplicitCastExpr, NoOp, const class A)
755// CHECK:    7: [B2.6].operator int
756// CHECK:    8: [B2.7]()
757// CHECK:    9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, int)
758// CHECK:   10: [B2.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
759// CHECK:    T: for (...; [B2.10]; )
760// CHECK:    Preds (2): B3 B11
761// CHECK:    Succs (2): B10 B1
762// CHECK:  [B3]
763// CHECK:    1: [B2.4].~A() (Implicit destructor)
764// CHECK:    Preds (2): B4 B7
765// CHECK:    Succs (1): B2
766// CHECK:  [B4]
767// CHECK:    1:  (CXXConstructExpr, class A)
768// CHECK:    2: A e;
769// CHECK:    3: [B4.2].~A() (Implicit destructor)
770// CHECK:    4: [B10.2].~A() (Implicit destructor)
771// CHECK:    Preds (1): B6
772// CHECK:    Succs (1): B3
773// CHECK:  [B5]
774// CHECK:    1: return;
775// CHECK:    2: [B10.2].~A() (Implicit destructor)
776// CHECK:    3: [B2.4].~A() (Implicit destructor)
777// CHECK:    4: [B11.4].~A() (Implicit destructor)
778// CHECK:    5: [B11.2].~A() (Implicit destructor)
779// CHECK:    Preds (1): B6
780// CHECK:    Succs (1): B0
781// CHECK:  [B6]
782// CHECK:    1: UV
783// CHECK:    2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
784// CHECK:    T: if [B6.2]
785// CHECK:    Preds (1): B8
786// CHECK:    Succs (2): B5 B4
787// CHECK:  [B7]
788// CHECK:    1: [B10.2].~A() (Implicit destructor)
789// CHECK:    T: continue;
790// CHECK:    Preds (1): B8
791// CHECK:    Succs (1): B3
792// CHECK:  [B8]
793// CHECK:    1: UV
794// CHECK:    2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
795// CHECK:    T: if [B8.2]
796// CHECK:    Preds (1): B10
797// CHECK:    Succs (2): B7 B6
798// CHECK:  [B9]
799// CHECK:    1: [B10.2].~A() (Implicit destructor)
800// CHECK:    T: break;
801// CHECK:    Preds (1): B10
802// CHECK:    Succs (1): B1
803// CHECK:  [B10]
804// CHECK:    1:  (CXXConstructExpr, class A)
805// CHECK:    2: A d;
806// CHECK:    3: UV
807// CHECK:    4: [B10.3] (ImplicitCastExpr, LValueToRValue, _Bool)
808// CHECK:    T: if [B10.4]
809// CHECK:    Preds (1): B2
810// CHECK:    Succs (2): B9 B8
811// CHECK:  [B11]
812// CHECK:    1:  (CXXConstructExpr, class A)
813// CHECK:    2: A a;
814// CHECK:    3:  (CXXConstructExpr, class A)
815// CHECK:    4: A b;
816// CHECK:    Preds (1): B12
817// CHECK:    Succs (1): B2
818// CHECK:  [B0 (EXIT)]
819// CHECK:    Preds (2): B1 B5
820// CHECK:  [B3 (ENTRY)]
821// CHECK:    Succs (1): B0
822// CHECK:  [B1]
823// CHECK:    T: try ...
824// CHECK:    Succs (2): B2 B0
825// CHECK:  [B2]
826// CHECK:   catch (const A &e):
827// CHECK:    Preds (1): B1
828// CHECK:    Succs (1): B0
829// CHECK:  [B0 (EXIT)]
830// CHECK:    Preds (3): B2 B1 B3
831// CHECK:  [B3 (ENTRY)]
832// CHECK:    Succs (1): B0
833// CHECK:  [B1]
834// CHECK:    T: try ...
835// CHECK:    Succs (2): B2 B0
836// CHECK:  [B2]
837// CHECK:   catch (A e):
838// CHECK:    1: .~A() (Implicit destructor)
839// CHECK:    Preds (1): B1
840// CHECK:    Succs (1): B0
841// CHECK:  [B0 (EXIT)]
842// CHECK:    Preds (3): B2 B1 B3
843
844
845