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