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