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