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