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