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 
6 class A {
7 public:
8   A() {}
9   ~A() {}
10 
11   static A make() { return A(); }
12 
13   operator bool() { return false; }
14   operator int() { return 0; }
15 };
16 
17 class B {
18 public:
19   B() {}
20   ~B() {}
21 
22   operator bool() { return true; }
23   operator int() { return 1; }
24   operator A() { return A(); }
25 };
26 
27 void foo(int);
28 void foo(bool);
29 void foo(const A&);
30 
31 void test_binary() {
32   int a = int(A()) + int(B());
33   foo(int(A()) + int(B()));
34   int b;
35 }
36 
37 void test_and() {
38   bool a = A() && B();
39   foo(A() && B());
40   int b;
41 }
42 
43 void test_or() {
44   bool a = A() || B();
45   foo(A() || B());
46   int b;
47 }
48 
49 void test_cond() {
50   A a = B() ? A() : A(B());
51   if (B()) { foo(0); } else { foo(0); }
52   int b;
53 }
54 
55 void test_cond_cref() {
56   const A& a = B() ? A() : A(B());
57   foo(B() ? A() : A(B()));
58   int b;
59 }
60 
61 void test_cond_implicit() {
62   A a = A() ?: A();
63   int b;
64 }
65 
66 void test_cond_implicit_cref() {
67   const A& a = A() ?: A();
68   foo(A() ?: A());
69   int b;
70 }
71 
72 void test_copy_init() {
73   A a = A();
74   int b;
75 }
76 
77 void test_cref_init() {
78   const A& a = A();
79   foo(A());
80   int b;
81 }
82 
83 void test_call_copy_init() {
84   A a = A::make();
85   int b;
86 }
87 
88 void test_call_cref_init() {
89   const A& a = A::make();
90   foo(A::make());
91   int b;
92 }
93 
94 void test_assign() {
95   int a;
96   a = A();
97   int b;
98 }
99 
100 class TestCtorInits {
101   int a;
102   int b;
103 public:
104   TestCtorInits();
105 };
106 
107 TestCtorInits::TestCtorInits()
108   : a(int(A()) + int(B()))
109   , b() {}
110 
111 class NoReturn {
112 public:
113   ~NoReturn() __attribute__((noreturn));
114   void f();
115 };
116 
117 void test_noreturn1() {
118   int a;
119   NoReturn().f();
120   int b;
121 }
122 
123 void 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