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