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 5 class A { 6 public: 7 A() {} 8 ~A() {} 9 10 static A make() { return A(); } 11 12 operator bool() { return false; } 13 operator int() { return 0; } 14 }; 15 16 class B { 17 public: 18 B() {} 19 ~B() {} 20 21 operator bool() { return true; } 22 operator int() { return 1; } 23 operator A() { return A(); } 24 }; 25 26 void foo(int); 27 void foo(bool); 28 void foo(const A&); 29 30 void test_binary() { 31 int a = int(A()) + int(B()); 32 foo(int(A()) + int(B())); 33 int b; 34 } 35 36 void test_and() { 37 bool a = A() && B(); 38 foo(A() && B()); 39 int b; 40 } 41 42 void test_or() { 43 bool a = A() || B(); 44 foo(A() || B()); 45 int b; 46 } 47 48 void test_cond() { 49 A a = B() ? A() : A(B()); 50 if (B()) { foo(0); } else { foo(0); } 51 int b; 52 } 53 54 struct C { 55 C():b_(true) {} 56 ~C() {} 57 58 operator bool() { return b_; } 59 bool b_; 60 }; 61 62 struct D { 63 D():b_(true) {} 64 65 operator bool() { return b_; } 66 bool b_; 67 }; 68 69 int test_cond_unnamed_custom_destructor() { 70 if (C()) { return 1; } else { return 0; } 71 } 72 73 int test_cond_named_custom_destructor() { 74 if (C c = C()) { return 1; } else { return 0; } 75 } 76 77 int test_cond_unnamed_auto_destructor() { 78 if (D()) { return 1; } else { return 0; } 79 } 80 81 int test_cond_named_auto_destructor() { 82 if (D d = D()) { return 1; } else { return 0; } 83 } 84 85 void test_cond_cref() { 86 const A& a = B() ? A() : A(B()); 87 foo(B() ? A() : A(B())); 88 int b; 89 } 90 91 void test_cond_implicit() { 92 A a = A() ?: A(); 93 int b; 94 } 95 96 void test_cond_implicit_cref() { 97 const A& a = A() ?: A(); 98 foo(A() ?: A()); 99 int b; 100 } 101 102 void test_copy_init() { 103 A a = A(); 104 int b; 105 } 106 107 void test_cref_init() { 108 const A& a = A(); 109 foo(A()); 110 int b; 111 } 112 113 void test_call_copy_init() { 114 A a = A::make(); 115 int b; 116 } 117 118 void test_call_cref_init() { 119 const A& a = A::make(); 120 foo(A::make()); 121 int b; 122 } 123 124 void test_assign() { 125 int a; 126 a = A(); 127 int b; 128 } 129 130 class TestCtorInits { 131 int a; 132 int b; 133 public: 134 TestCtorInits(); 135 }; 136 137 TestCtorInits::TestCtorInits() 138 : a(int(A()) + int(B())) 139 , b() {} 140 141 class NoReturn { 142 public: 143 ~NoReturn() __attribute__((noreturn)); 144 void f(); 145 }; 146 147 void test_noreturn1() { 148 int a; 149 NoReturn().f(); 150 int b; 151 } 152 153 void test_noreturn2() { 154 int a; 155 NoReturn(), 47; 156 int b; 157 } 158 159 extern bool check(const NoReturn&); 160 161 // PR16664 and PR18159 162 int testConsistencyNestedSimple(bool value) { 163 if (value) { 164 if (!value || check(NoReturn())) { 165 return 1; 166 } 167 } 168 return 0; 169 } 170 171 // PR16664 and PR18159 172 int testConsistencyNestedComplex(bool value) { 173 if (value) { 174 if (!value || !value || check(NoReturn())) { 175 return 1; 176 } 177 } 178 return 0; 179 } 180 181 // PR16664 and PR18159 182 int testConsistencyNestedNormalReturn(bool value) { 183 if (value) { 184 if (!value || value || check(NoReturn())) { 185 return 1; 186 } 187 } 188 return 0; 189 } 190 191 // CHECK: [B1 (ENTRY)] 192 // CHECK: Succs (1): B0 193 // CHECK: [B0 (EXIT)] 194 // CHECK: Preds (1): B1 195 // CHECK: [B1 (ENTRY)] 196 // CHECK: Succs (1): B0 197 // CHECK: [B0 (EXIT)] 198 // CHECK: Preds (1): B1 199 // CHECK: [B2 (ENTRY)] 200 // CHECK: Succs (1): B1 201 // CHECK: [B1] 202 // CHECK: 1: A() (CXXConstructExpr, class A) 203 // CHECK: 2: [B1.1] (BindTemporary) 204 // CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A) 205 // CHECK: 4: [B1.3] 206 // CHECK: 5: [B1.4] (CXXConstructExpr, class A) 207 // CHECK: 6: ~A() (Temporary object destructor) 208 // CHECK: 7: return [B1.5]; 209 // CHECK: Preds (1): B2 210 // CHECK: Succs (1): B0 211 // CHECK: [B0 (EXIT)] 212 // CHECK: Preds (1): B1 213 // CHECK: [B2 (ENTRY)] 214 // CHECK: Succs (1): B1 215 // CHECK: [B1] 216 // CHECK: 1: false 217 // CHECK: 2: return [B1.1]; 218 // CHECK: Preds (1): B2 219 // CHECK: Succs (1): B0 220 // CHECK: [B0 (EXIT)] 221 // CHECK: Preds (1): B1 222 // CHECK: [B2 (ENTRY)] 223 // CHECK: Succs (1): B1 224 // CHECK: [B1] 225 // CHECK: 1: 0 226 // CHECK: 2: return [B1.1]; 227 // CHECK: Preds (1): B2 228 // CHECK: Succs (1): B0 229 // CHECK: [B0 (EXIT)] 230 // CHECK: Preds (1): B1 231 // CHECK: [B1 (ENTRY)] 232 // CHECK: Succs (1): B0 233 // CHECK: [B0 (EXIT)] 234 // CHECK: Preds (1): B1 235 // CHECK: [B1 (ENTRY)] 236 // CHECK: Succs (1): B0 237 // CHECK: [B0 (EXIT)] 238 // CHECK: Preds (1): B1 239 // CHECK: [B2 (ENTRY)] 240 // CHECK: Succs (1): B1 241 // CHECK: [B1] 242 // CHECK: 1: true 243 // CHECK: 2: return [B1.1]; 244 // CHECK: Preds (1): B2 245 // CHECK: Succs (1): B0 246 // CHECK: [B0 (EXIT)] 247 // CHECK: Preds (1): B1 248 // CHECK: [B2 (ENTRY)] 249 // CHECK: Succs (1): B1 250 // CHECK: [B1] 251 // CHECK: 1: 1 252 // CHECK: 2: return [B1.1]; 253 // CHECK: Preds (1): B2 254 // CHECK: Succs (1): B0 255 // CHECK: [B0 (EXIT)] 256 // CHECK: Preds (1): B1 257 // CHECK: [B2 (ENTRY)] 258 // CHECK: Succs (1): B1 259 // CHECK: [B1] 260 // CHECK: 1: A() (CXXConstructExpr, class A) 261 // CHECK: 2: [B1.1] (BindTemporary) 262 // CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A) 263 // CHECK: 4: [B1.3] 264 // CHECK: 5: [B1.4] (CXXConstructExpr, class A) 265 // CHECK: 6: ~A() (Temporary object destructor) 266 // CHECK: 7: return [B1.5]; 267 // CHECK: Preds (1): B2 268 // CHECK: Succs (1): B0 269 // CHECK: [B0 (EXIT)] 270 // CHECK: Preds (1): B1 271 // CHECK: [B2 (ENTRY)] 272 // CHECK: Succs (1): B1 273 // CHECK: [B1] 274 // CHECK: 1: A() (CXXConstructExpr, class A) 275 // CHECK: 2: [B1.1] (BindTemporary) 276 // CHECK: 3: [B1.2].operator int 277 // CHECK: 4: [B1.2] 278 // CHECK: 5: [B1.4] (ImplicitCastExpr, UserDefinedConversion, int) 279 // CHECK: 6: int([B1.5]) (CXXFunctionalCastExpr, NoOp, int) 280 // CHECK: 7: B() (CXXConstructExpr, class B) 281 // CHECK: 8: [B1.7] (BindTemporary) 282 // CHECK: 9: [B1.8].operator int 283 // CHECK: 10: [B1.8] 284 // CHECK: 11: [B1.10] (ImplicitCastExpr, UserDefinedConversion, int) 285 // CHECK: 12: int([B1.11]) (CXXFunctionalCastExpr, NoOp, int) 286 // CHECK: 13: [B1.6] + [B1.12] 287 // CHECK: 14: int a = int(A()) + int(B()); 288 // CHECK: 15: ~B() (Temporary object destructor) 289 // CHECK: 16: ~A() (Temporary object destructor) 290 // CHECK: 17: foo 291 // CHECK: 18: [B1.17] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int)) 292 // CHECK: 19: A() (CXXConstructExpr, class A) 293 // CHECK: 20: [B1.19] (BindTemporary) 294 // CHECK: 21: [B1.20].operator int 295 // CHECK: 22: [B1.20] 296 // CHECK: 23: [B1.22] (ImplicitCastExpr, UserDefinedConversion, int) 297 // CHECK: 24: int([B1.23]) (CXXFunctionalCastExpr, NoOp, int) 298 // CHECK: 25: B() (CXXConstructExpr, class B) 299 // CHECK: 26: [B1.25] (BindTemporary) 300 // CHECK: 27: [B1.26].operator int 301 // CHECK: 28: [B1.26] 302 // CHECK: 29: [B1.28] (ImplicitCastExpr, UserDefinedConversion, int) 303 // CHECK: 30: int([B1.29]) (CXXFunctionalCastExpr, NoOp, int) 304 // CHECK: 31: [B1.24] + [B1.30] 305 // CHECK: 32: [B1.18]([B1.31]) 306 // CHECK: 33: ~B() (Temporary object destructor) 307 // CHECK: 34: ~A() (Temporary object destructor) 308 // CHECK: 35: int b; 309 // CHECK: Preds (1): B2 310 // CHECK: Succs (1): B0 311 // CHECK: [B0 (EXIT)] 312 // CHECK: Preds (1): B1 313 // CHECK: [B10 (ENTRY)] 314 // CHECK: Succs (1): B9 315 // CHECK: [B1] 316 // CHECK: 1: ~A() (Temporary object destructor) 317 // CHECK: 2: int b; 318 // CHECK: Preds (2): B2 B3 319 // CHECK: Succs (1): B0 320 // CHECK: [B2] 321 // CHECK: 1: ~B() (Temporary object destructor) 322 // CHECK: Preds (1): B3 323 // CHECK: Succs (1): B1 324 // CHECK: [B3] 325 // CHECK: 1: [B5.8] && [B4.5] 326 // CHECK: 2: [B5.3]([B3.1]) 327 // CHECK: T: (Temp Dtor) [B4.2] 328 // CHECK: Preds (2): B4 B5 329 // CHECK: Succs (2): B2 B1 330 // CHECK: [B4] 331 // CHECK: 1: B() (CXXConstructExpr, class B) 332 // CHECK: 2: [B4.1] (BindTemporary) 333 // CHECK: 3: [B4.2].operator bool 334 // CHECK: 4: [B4.2] 335 // CHECK: 5: [B4.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 336 // CHECK: Preds (1): B5 337 // CHECK: Succs (1): B3 338 // CHECK: [B5] 339 // CHECK: 1: ~A() (Temporary object destructor) 340 // CHECK: 2: foo 341 // CHECK: 3: [B5.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool)) 342 // CHECK: 4: A() (CXXConstructExpr, class A) 343 // CHECK: 5: [B5.4] (BindTemporary) 344 // CHECK: 6: [B5.5].operator bool 345 // CHECK: 7: [B5.5] 346 // CHECK: 8: [B5.7] (ImplicitCastExpr, UserDefinedConversion, _Bool) 347 // CHECK: T: [B5.8] && ... 348 // CHECK: Preds (2): B6 B7 349 // CHECK: Succs (2): B4 B3 350 // CHECK: [B6] 351 // CHECK: 1: ~B() (Temporary object destructor) 352 // CHECK: Preds (1): B7 353 // CHECK: Succs (1): B5 354 // CHECK: [B7] 355 // CHECK: 1: [B9.5] && [B8.5] 356 // CHECK: 2: bool a = A() && B(); 357 // CHECK: T: (Temp Dtor) [B8.2] 358 // CHECK: Preds (2): B8 B9 359 // CHECK: Succs (2): B6 B5 360 // CHECK: [B8] 361 // CHECK: 1: B() (CXXConstructExpr, class B) 362 // CHECK: 2: [B8.1] (BindTemporary) 363 // CHECK: 3: [B8.2].operator bool 364 // CHECK: 4: [B8.2] 365 // CHECK: 5: [B8.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 366 // CHECK: Preds (1): B9 367 // CHECK: Succs (1): B7 368 // CHECK: [B9] 369 // CHECK: 1: A() (CXXConstructExpr, class A) 370 // CHECK: 2: [B9.1] (BindTemporary) 371 // CHECK: 3: [B9.2].operator bool 372 // CHECK: 4: [B9.2] 373 // CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 374 // CHECK: T: [B9.5] && ... 375 // CHECK: Preds (1): B10 376 // CHECK: Succs (2): B8 B7 377 // CHECK: [B0 (EXIT)] 378 // CHECK: Preds (1): B1 379 // CHECK: [B10 (ENTRY)] 380 // CHECK: Succs (1): B9 381 // CHECK: [B1] 382 // CHECK: 1: ~A() (Temporary object destructor) 383 // CHECK: 2: int b; 384 // CHECK: Preds (2): B2 B3 385 // CHECK: Succs (1): B0 386 // CHECK: [B2] 387 // CHECK: 1: ~B() (Temporary object destructor) 388 // CHECK: Preds (1): B3 389 // CHECK: Succs (1): B1 390 // CHECK: [B3] 391 // CHECK: 1: [B5.8] || [B4.5] 392 // CHECK: 2: [B5.3]([B3.1]) 393 // CHECK: T: (Temp Dtor) [B4.2] 394 // CHECK: Preds (2): B4 B5 395 // CHECK: Succs (2): B2 B1 396 // CHECK: [B4] 397 // CHECK: 1: B() (CXXConstructExpr, class B) 398 // CHECK: 2: [B4.1] (BindTemporary) 399 // CHECK: 3: [B4.2].operator bool 400 // CHECK: 4: [B4.2] 401 // CHECK: 5: [B4.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 402 // CHECK: Preds (1): B5 403 // CHECK: Succs (1): B3 404 // CHECK: [B5] 405 // CHECK: 1: ~A() (Temporary object destructor) 406 // CHECK: 2: foo 407 // CHECK: 3: [B5.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool)) 408 // CHECK: 4: A() (CXXConstructExpr, class A) 409 // CHECK: 5: [B5.4] (BindTemporary) 410 // CHECK: 6: [B5.5].operator bool 411 // CHECK: 7: [B5.5] 412 // CHECK: 8: [B5.7] (ImplicitCastExpr, UserDefinedConversion, _Bool) 413 // CHECK: T: [B5.8] || ... 414 // CHECK: Preds (2): B6 B7 415 // CHECK: Succs (2): B3 B4 416 // CHECK: [B6] 417 // CHECK: 1: ~B() (Temporary object destructor) 418 // CHECK: Preds (1): B7 419 // CHECK: Succs (1): B5 420 // CHECK: [B7] 421 // CHECK: 1: [B9.5] || [B8.5] 422 // CHECK: 2: bool a = A() || B(); 423 // CHECK: T: (Temp Dtor) [B8.2] 424 // CHECK: Preds (2): B8 B9 425 // CHECK: Succs (2): B6 B5 426 // CHECK: [B8] 427 // CHECK: 1: B() (CXXConstructExpr, class B) 428 // CHECK: 2: [B8.1] (BindTemporary) 429 // CHECK: 3: [B8.2].operator bool 430 // CHECK: 4: [B8.2] 431 // CHECK: 5: [B8.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 432 // CHECK: Preds (1): B9 433 // CHECK: Succs (1): B7 434 // CHECK: [B9] 435 // CHECK: 1: A() (CXXConstructExpr, class A) 436 // CHECK: 2: [B9.1] (BindTemporary) 437 // CHECK: 3: [B9.2].operator bool 438 // CHECK: 4: [B9.2] 439 // CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 440 // CHECK: T: [B9.5] || ... 441 // CHECK: Preds (1): B10 442 // CHECK: Succs (2): B7 B8 443 // CHECK: [B0 (EXIT)] 444 // CHECK: Preds (1): B1 445 // CHECK: [B11 (ENTRY)] 446 // CHECK: Succs (1): B10 447 // CHECK: [B1] 448 // CHECK: 1: int b; 449 // CHECK: 2: [B7.5].~A() (Implicit destructor) 450 // CHECK: Preds (2): B2 B3 451 // CHECK: Succs (1): B0 452 // CHECK: [B2] 453 // CHECK: 1: foo 454 // CHECK: 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int)) 455 // CHECK: 3: 0 456 // CHECK: 4: [B2.2]([B2.3]) 457 // CHECK: Preds (1): B4 458 // CHECK: Succs (1): B1 459 // CHECK: [B3] 460 // CHECK: 1: foo 461 // CHECK: 2: [B3.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int)) 462 // CHECK: 3: 0 463 // CHECK: 4: [B3.2]([B3.3]) 464 // CHECK: Preds (1): B4 465 // CHECK: Succs (1): B1 466 // CHECK: [B4] 467 // CHECK: 1: ~B() (Temporary object destructor) 468 // CHECK: 2: B() (CXXConstructExpr, class B) 469 // CHECK: 3: [B4.2] (BindTemporary) 470 // CHECK: 4: [B4.3].operator bool 471 // CHECK: 5: [B4.3] 472 // CHECK: 6: [B4.5] (ImplicitCastExpr, UserDefinedConversion, _Bool) 473 // CHECK: 7: ~B() (Temporary object destructor) 474 // CHECK: T: if [B4.6] 475 // CHECK: Preds (2): B5 B6 476 // CHECK: Succs (2): B3 B2 477 // CHECK: [B5] 478 // CHECK: 1: ~A() (Temporary object destructor) 479 // CHECK: 2: ~A() (Temporary object destructor) 480 // CHECK: Preds (1): B7 481 // CHECK: Succs (1): B4 482 // CHECK: [B6] 483 // CHECK: 1: ~A() (Temporary object destructor) 484 // CHECK: 2: ~A() (Temporary object destructor) 485 // CHECK: 3: ~A() (Temporary object destructor) 486 // CHECK: 4: ~B() (Temporary object destructor) 487 // CHECK: Preds (1): B7 488 // CHECK: Succs (1): B4 489 // CHECK: [B7] 490 // CHECK: 1: [B10.5] ? [B8.6] : [B9.15] 491 // CHECK: 2: [B7.1] (ImplicitCastExpr, NoOp, const class A) 492 // CHECK: 3: [B7.2] 493 // CHECK: 4: [B7.3] (CXXConstructExpr, class A) 494 // CHECK: 5: A a = B() ? A() : A(B()); 495 // CHECK: T: (Temp Dtor) [B9.2] 496 // CHECK: Preds (2): B8 B9 497 // CHECK: Succs (2): B6 B5 498 // CHECK: [B8] 499 // CHECK: 1: A() (CXXConstructExpr, class A) 500 // CHECK: 2: [B8.1] (BindTemporary) 501 // CHECK: 3: [B8.2] (ImplicitCastExpr, NoOp, const class A) 502 // CHECK: 4: [B8.3] 503 // CHECK: 5: [B8.4] (CXXConstructExpr, class A) 504 // CHECK: 6: [B8.5] (BindTemporary) 505 // CHECK: Preds (1): B10 506 // CHECK: Succs (1): B7 507 // CHECK: [B9] 508 // CHECK: 1: B() (CXXConstructExpr, class B) 509 // CHECK: 2: [B9.1] (BindTemporary) 510 // CHECK: 3: [B9.2].operator A 511 // CHECK: 4: [B9.2] 512 // CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, class A) 513 // CHECK: 6: [B9.5] (BindTemporary) 514 // CHECK: 7: [B9.6] (ImplicitCastExpr, NoOp, const class A) 515 // CHECK: 8: [B9.7] 516 // CHECK: 9: [B9.8] (CXXConstructExpr, class A) 517 // CHECK: 10: [B9.9] (BindTemporary) 518 // CHECK: 11: A([B9.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A) 519 // CHECK: 12: [B9.11] (ImplicitCastExpr, NoOp, const class A) 520 // CHECK: 13: [B9.12] 521 // CHECK: 14: [B9.13] (CXXConstructExpr, class A) 522 // CHECK: 15: [B9.14] (BindTemporary) 523 // CHECK: Preds (1): B10 524 // CHECK: Succs (1): B7 525 // CHECK: [B10] 526 // CHECK: 1: B() (CXXConstructExpr, class B) 527 // CHECK: 2: [B10.1] (BindTemporary) 528 // CHECK: 3: [B10.2].operator bool 529 // CHECK: 4: [B10.2] 530 // CHECK: 5: [B10.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 531 // CHECK: T: [B10.5] ? ... : ... 532 // CHECK: Preds (1): B11 533 // CHECK: Succs (2): B8 B9 534 // CHECK: [B0 (EXIT)] 535 // CHECK: Preds (1): B1 536 // CHECK: [B2 (ENTRY)] 537 // CHECK: Succs (1): B1 538 // CHECK: [B1] 539 // CHECK: 1: true 540 // CHECK: 2: b_([B1.1]) (Member initializer) 541 // CHECK: Preds (1): B2 542 // CHECK: Succs (1): B0 543 // CHECK: [B0 (EXIT)] 544 // CHECK: Preds (1): B1 545 // CHECK: [B1 (ENTRY)] 546 // CHECK: Succs (1): B0 547 // CHECK: [B0 (EXIT)] 548 // CHECK: Preds (1): B1 549 // CHECK: [B2 (ENTRY)] 550 // CHECK: Succs (1): B1 551 // CHECK: [B1] 552 // CHECK: 1: this 553 // CHECK: 2: [B1.1]->b_ 554 // CHECK: 3: [B1.2] (ImplicitCastExpr, LValueToRValue, _Bool) 555 // CHECK: 4: return [B1.3]; 556 // CHECK: Preds (1): B2 557 // CHECK: Succs (1): B0 558 // CHECK: [B0 (EXIT)] 559 // CHECK: Preds (1): B1 560 // CHECK: [B2 (ENTRY)] 561 // CHECK: Succs (1): B1 562 // CHECK: [B1] 563 // CHECK: 1: true 564 // CHECK: 2: b_([B1.1]) (Member initializer) 565 // CHECK: Preds (1): B2 566 // CHECK: Succs (1): B0 567 // CHECK: [B0 (EXIT)] 568 // CHECK: Preds (1): B1 569 // CHECK: [B2 (ENTRY)] 570 // CHECK: Succs (1): B1 571 // CHECK: [B1] 572 // CHECK: 1: this 573 // CHECK: 2: [B1.1]->b_ 574 // CHECK: 3: [B1.2] (ImplicitCastExpr, LValueToRValue, _Bool) 575 // CHECK: 4: return [B1.3]; 576 // CHECK: Preds (1): B2 577 // CHECK: Succs (1): B0 578 // CHECK: [B0 (EXIT)] 579 // CHECK: Preds (1): B1 580 // CHECK: [B4 (ENTRY)] 581 // CHECK: Succs (1): B3 582 // CHECK: [B1] 583 // CHECK: 1: 0 584 // CHECK: 2: return [B1.1]; 585 // CHECK: Preds (1): B3 586 // CHECK: Succs (1): B0 587 // CHECK: [B2] 588 // CHECK: 1: 1 589 // CHECK: 2: return [B2.1]; 590 // CHECK: Preds (1): B3 591 // CHECK: Succs (1): B0 592 // CHECK: [B3] 593 // CHECK: 1: C() (CXXConstructExpr, struct C) 594 // CHECK: 2: [B3.1] (BindTemporary) 595 // CHECK: 3: [B3.2].operator bool 596 // CHECK: 4: [B3.2] 597 // CHECK: 5: [B3.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 598 // CHECK: 6: ~C() (Temporary object destructor) 599 // CHECK: T: if [B3.5] 600 // CHECK: Preds (1): B4 601 // CHECK: Succs (2): B2 B1 602 // CHECK: [B0 (EXIT)] 603 // CHECK: Preds (2): B1 B2 604 // CHECK: [B5 (ENTRY)] 605 // CHECK: Succs (1): B4 606 // CHECK: [B1] 607 // CHECK: 1: [B4.6].~C() (Implicit destructor) 608 // CHECK: Succs (1): B0 609 // CHECK: [B2] 610 // CHECK: 1: 0 611 // CHECK: 2: return [B2.1]; 612 // CHECK: 3: [B4.6].~C() (Implicit destructor) 613 // CHECK: Preds (1): B4 614 // CHECK: Succs (1): B0 615 // CHECK: [B3] 616 // CHECK: 1: 1 617 // CHECK: 2: return [B3.1]; 618 // CHECK: 3: [B4.6].~C() (Implicit destructor) 619 // CHECK: Preds (1): B4 620 // CHECK: Succs (1): B0 621 // CHECK: [B4] 622 // CHECK: 1: C() (CXXConstructExpr, struct C) 623 // CHECK: 2: [B4.1] (BindTemporary) 624 // CHECK: 3: [B4.2] (ImplicitCastExpr, NoOp, const struct C) 625 // CHECK: 4: [B4.3] 626 // CHECK: 5: [B4.4] (CXXConstructExpr, struct C) 627 // CHECK: 6: C c = C(); 628 // CHECK: 7: ~C() (Temporary object destructor) 629 // CHECK: 8: c 630 // CHECK: 9: [B4.8].operator bool 631 // CHECK: 10: [B4.8] 632 // CHECK: 11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, _Bool) 633 // CHECK: T: if [B4.11] 634 // CHECK: Preds (1): B5 635 // CHECK: Succs (2): B3 B2 636 // CHECK: [B0 (EXIT)] 637 // CHECK: Preds (3): B1 B2 B3 638 // CHECK: [B4 (ENTRY)] 639 // CHECK: Succs (1): B3 640 // CHECK: [B1] 641 // CHECK: 1: 0 642 // CHECK: 2: return [B1.1]; 643 // CHECK: Preds (1): B3 644 // CHECK: Succs (1): B0 645 // CHECK: [B2] 646 // CHECK: 1: 1 647 // CHECK: 2: return [B2.1]; 648 // CHECK: Preds (1): B3 649 // CHECK: Succs (1): B0 650 // CHECK: [B3] 651 // CHECK: 1: D() (CXXConstructExpr, struct D) 652 // CHECK: 2: [B3.1].operator bool 653 // CHECK: 3: [B3.1] 654 // CHECK: 4: [B3.3] (ImplicitCastExpr, UserDefinedConversion, _Bool) 655 // CHECK: T: if [B3.4] 656 // CHECK: Preds (1): B4 657 // CHECK: Succs (2): B2 B1 658 // CHECK: [B0 (EXIT)] 659 // CHECK: Preds (2): B1 B2 660 // CHECK: [B4 (ENTRY)] 661 // CHECK: Succs (1): B3 662 // CHECK: [B1] 663 // CHECK: 1: 0 664 // CHECK: 2: return [B1.1]; 665 // CHECK: Preds (1): B3 666 // CHECK: Succs (1): B0 667 // CHECK: [B2] 668 // CHECK: 1: 1 669 // CHECK: 2: return [B2.1]; 670 // CHECK: Preds (1): B3 671 // CHECK: Succs (1): B0 672 // CHECK: [B3] 673 // CHECK: 1: D() (CXXConstructExpr, struct D) 674 // CHECK: 2: [B3.1] (ImplicitCastExpr, NoOp, const struct D) 675 // CHECK: 3: [B3.2] 676 // CHECK: 4: [B3.3] (CXXConstructExpr, struct D) 677 // CHECK: 5: D d = D(); 678 // CHECK: 6: d 679 // CHECK: 7: [B3.6].operator bool 680 // CHECK: 8: [B3.6] 681 // CHECK: 9: [B3.8] (ImplicitCastExpr, UserDefinedConversion, _Bool) 682 // CHECK: T: if [B3.9] 683 // CHECK: Preds (1): B4 684 // CHECK: Succs (2): B2 B1 685 // CHECK: [B0 (EXIT)] 686 // CHECK: Preds (2): B1 B2 687 // CHECK: [B14 (ENTRY)] 688 // CHECK: Succs (1): B13 689 // CHECK: [B1] 690 // CHECK: 1: ~B() (Temporary object destructor) 691 // CHECK: 2: int b; 692 // CHECK: 3: [B10.4].~A() (Implicit destructor) 693 // CHECK: Preds (2): B2 B3 694 // CHECK: Succs (1): B0 695 // CHECK: [B2] 696 // CHECK: 1: ~A() (Temporary object destructor) 697 // CHECK: 2: ~A() (Temporary object destructor) 698 // CHECK: Preds (1): B4 699 // CHECK: Succs (1): B1 700 // CHECK: [B3] 701 // CHECK: 1: ~A() (Temporary object destructor) 702 // CHECK: 2: ~A() (Temporary object destructor) 703 // CHECK: 3: ~A() (Temporary object destructor) 704 // CHECK: 4: ~B() (Temporary object destructor) 705 // CHECK: Preds (1): B4 706 // CHECK: Succs (1): B1 707 // CHECK: [B4] 708 // CHECK: 1: [B7.8] ? [B5.6] : [B6.15] 709 // CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A) 710 // CHECK: 3: [B4.2] 711 // CHECK: 4: [B7.3]([B4.3]) 712 // CHECK: T: (Temp Dtor) [B6.2] 713 // CHECK: Preds (2): B5 B6 714 // CHECK: Succs (2): B3 B2 715 // CHECK: [B5] 716 // CHECK: 1: A() (CXXConstructExpr, class A) 717 // CHECK: 2: [B5.1] (BindTemporary) 718 // CHECK: 3: [B5.2] (ImplicitCastExpr, NoOp, const class A) 719 // CHECK: 4: [B5.3] 720 // CHECK: 5: [B5.4] (CXXConstructExpr, class A) 721 // CHECK: 6: [B5.5] (BindTemporary) 722 // CHECK: Preds (1): B7 723 // CHECK: Succs (1): B4 724 // CHECK: [B6] 725 // CHECK: 1: B() (CXXConstructExpr, class B) 726 // CHECK: 2: [B6.1] (BindTemporary) 727 // CHECK: 3: [B6.2].operator A 728 // CHECK: 4: [B6.2] 729 // CHECK: 5: [B6.4] (ImplicitCastExpr, UserDefinedConversion, class A) 730 // CHECK: 6: [B6.5] (BindTemporary) 731 // CHECK: 7: [B6.6] (ImplicitCastExpr, NoOp, const class A) 732 // CHECK: 8: [B6.7] 733 // CHECK: 9: [B6.8] (CXXConstructExpr, class A) 734 // CHECK: 10: [B6.9] (BindTemporary) 735 // CHECK: 11: A([B6.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A) 736 // CHECK: 12: [B6.11] (ImplicitCastExpr, NoOp, const class A) 737 // CHECK: 13: [B6.12] 738 // CHECK: 14: [B6.13] (CXXConstructExpr, class A) 739 // CHECK: 15: [B6.14] (BindTemporary) 740 // CHECK: Preds (1): B7 741 // CHECK: Succs (1): B4 742 // CHECK: [B7] 743 // CHECK: 1: ~B() (Temporary object destructor) 744 // CHECK: 2: foo 745 // CHECK: 3: [B7.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &)) 746 // CHECK: 4: B() (CXXConstructExpr, class B) 747 // CHECK: 5: [B7.4] (BindTemporary) 748 // CHECK: 6: [B7.5].operator bool 749 // CHECK: 7: [B7.5] 750 // CHECK: 8: [B7.7] (ImplicitCastExpr, UserDefinedConversion, _Bool) 751 // CHECK: T: [B7.8] ? ... : ... 752 // CHECK: Preds (2): B8 B9 753 // CHECK: Succs (2): B5 B6 754 // CHECK: [B8] 755 // CHECK: 1: ~A() (Temporary object destructor) 756 // CHECK: Preds (1): B10 757 // CHECK: Succs (1): B7 758 // CHECK: [B9] 759 // CHECK: 1: ~A() (Temporary object destructor) 760 // CHECK: 2: ~A() (Temporary object destructor) 761 // CHECK: 3: ~B() (Temporary object destructor) 762 // CHECK: Preds (1): B10 763 // CHECK: Succs (1): B7 764 // CHECK: [B10] 765 // CHECK: 1: [B13.5] ? [B11.6] : [B12.15] 766 // CHECK: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A) 767 // CHECK: 3: [B10.2] 768 // CHECK: 4: const A &a = B() ? A() : A(B()); 769 // CHECK: T: (Temp Dtor) [B12.2] 770 // CHECK: Preds (2): B11 B12 771 // CHECK: Succs (2): B9 B8 772 // CHECK: [B11] 773 // CHECK: 1: A() (CXXConstructExpr, class A) 774 // CHECK: 2: [B11.1] (BindTemporary) 775 // CHECK: 3: [B11.2] (ImplicitCastExpr, NoOp, const class A) 776 // CHECK: 4: [B11.3] 777 // CHECK: 5: [B11.4] (CXXConstructExpr, class A) 778 // CHECK: 6: [B11.5] (BindTemporary) 779 // CHECK: Preds (1): B13 780 // CHECK: Succs (1): B10 781 // CHECK: [B12] 782 // CHECK: 1: B() (CXXConstructExpr, class B) 783 // CHECK: 2: [B12.1] (BindTemporary) 784 // CHECK: 3: [B12.2].operator A 785 // CHECK: 4: [B12.2] 786 // CHECK: 5: [B12.4] (ImplicitCastExpr, UserDefinedConversion, class A) 787 // CHECK: 6: [B12.5] (BindTemporary) 788 // CHECK: 7: [B12.6] (ImplicitCastExpr, NoOp, const class A) 789 // CHECK: 8: [B12.7] 790 // CHECK: 9: [B12.8] (CXXConstructExpr, class A) 791 // CHECK: 10: [B12.9] (BindTemporary) 792 // CHECK: 11: A([B12.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A) 793 // CHECK: 12: [B12.11] (ImplicitCastExpr, NoOp, const class A) 794 // CHECK: 13: [B12.12] 795 // CHECK: 14: [B12.13] (CXXConstructExpr, class A) 796 // CHECK: 15: [B12.14] (BindTemporary) 797 // CHECK: Preds (1): B13 798 // CHECK: Succs (1): B10 799 // CHECK: [B13] 800 // CHECK: 1: B() (CXXConstructExpr, class B) 801 // CHECK: 2: [B13.1] (BindTemporary) 802 // CHECK: 3: [B13.2].operator bool 803 // CHECK: 4: [B13.2] 804 // CHECK: 5: [B13.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 805 // CHECK: T: [B13.5] ? ... : ... 806 // CHECK: Preds (1): B14 807 // CHECK: Succs (2): B11 B12 808 // CHECK: [B0 (EXIT)] 809 // CHECK: Preds (1): B1 810 // CHECK: [B8 (ENTRY)] 811 // CHECK: Succs (1): B7 812 // CHECK: [B1] 813 // CHECK: 1: int b; 814 // CHECK: 2: [B4.5].~A() (Implicit destructor) 815 // CHECK: Preds (2): B2 B3 816 // CHECK: Succs (1): B0 817 // CHECK: [B2] 818 // CHECK: 1: ~A() (Temporary object destructor) 819 // CHECK: Preds (1): B4 820 // CHECK: Succs (1): B1 821 // CHECK: [B3] 822 // CHECK: 1: ~A() (Temporary object destructor) 823 // CHECK: 2: ~A() (Temporary object destructor) 824 // CHECK: Preds (1): B4 825 // CHECK: Succs (1): B1 826 // CHECK: [B4] 827 // CHECK: 1: [B7.2] ?: [B6.6] 828 // CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A) 829 // CHECK: 3: [B4.2] 830 // CHECK: 4: [B4.3] (CXXConstructExpr, class A) 831 // CHECK: 5: A a = A() ?: A(); 832 // CHECK: T: (Temp Dtor) [B6.2] 833 // CHECK: Preds (2): B5 B6 834 // CHECK: Succs (2): B3 B2 835 // CHECK: [B5] 836 // CHECK: 1: [B7.2] (ImplicitCastExpr, NoOp, const class A) 837 // CHECK: 2: [B5.1] 838 // CHECK: 3: [B5.2] (CXXConstructExpr, class A) 839 // CHECK: 4: [B5.3] (BindTemporary) 840 // CHECK: Preds (1): B7 841 // CHECK: Succs (1): B4 842 // CHECK: [B6] 843 // CHECK: 1: A() (CXXConstructExpr, class A) 844 // CHECK: 2: [B6.1] (BindTemporary) 845 // CHECK: 3: [B6.2] (ImplicitCastExpr, NoOp, const class A) 846 // CHECK: 4: [B6.3] 847 // CHECK: 5: [B6.4] (CXXConstructExpr, class A) 848 // CHECK: 6: [B6.5] (BindTemporary) 849 // CHECK: Preds (1): B7 850 // CHECK: Succs (1): B4 851 // CHECK: [B7] 852 // CHECK: 1: A() (CXXConstructExpr, class A) 853 // CHECK: 2: [B7.1] (BindTemporary) 854 // CHECK: 3: [B7.2].operator bool 855 // CHECK: 4: [B7.2] 856 // CHECK: 5: [B7.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 857 // CHECK: T: [B7.5] ? ... : ... 858 // CHECK: Preds (1): B8 859 // CHECK: Succs (2): B5 B6 860 // CHECK: [B0 (EXIT)] 861 // CHECK: Preds (1): B1 862 // CHECK: [B13 (ENTRY)] 863 // CHECK: Succs (1): B12 864 // CHECK: [B1] 865 // CHECK: 1: int b; 866 // CHECK: 2: [B9.4].~A() (Implicit destructor) 867 // CHECK: Preds (2): B2 B3 868 // CHECK: Succs (1): B0 869 // CHECK: [B2] 870 // CHECK: 1: ~A() (Temporary object destructor) 871 // CHECK: Preds (1): B4 872 // CHECK: Succs (1): B1 873 // CHECK: [B3] 874 // CHECK: 1: ~A() (Temporary object destructor) 875 // CHECK: 2: ~A() (Temporary object destructor) 876 // CHECK: Preds (1): B4 877 // CHECK: Succs (1): B1 878 // CHECK: [B4] 879 // CHECK: 1: [B7.4] ?: [B6.6] 880 // CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A) 881 // CHECK: 3: [B4.2] 882 // CHECK: 4: [B7.2]([B4.3]) 883 // CHECK: T: (Temp Dtor) [B6.2] 884 // CHECK: Preds (2): B5 B6 885 // CHECK: Succs (2): B3 B2 886 // CHECK: [B5] 887 // CHECK: 1: [B7.4] (ImplicitCastExpr, NoOp, const class A) 888 // CHECK: 2: [B5.1] 889 // CHECK: 3: [B5.2] (CXXConstructExpr, class A) 890 // CHECK: 4: [B5.3] (BindTemporary) 891 // CHECK: Preds (1): B7 892 // CHECK: Succs (1): B4 893 // CHECK: [B6] 894 // CHECK: 1: A() (CXXConstructExpr, class A) 895 // CHECK: 2: [B6.1] (BindTemporary) 896 // CHECK: 3: [B6.2] (ImplicitCastExpr, NoOp, const class A) 897 // CHECK: 4: [B6.3] 898 // CHECK: 5: [B6.4] (CXXConstructExpr, class A) 899 // CHECK: 6: [B6.5] (BindTemporary) 900 // CHECK: Preds (1): B7 901 // CHECK: Succs (1): B4 902 // CHECK: [B7] 903 // CHECK: 1: foo 904 // CHECK: 2: [B7.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &)) 905 // CHECK: 3: A() (CXXConstructExpr, class A) 906 // CHECK: 4: [B7.3] (BindTemporary) 907 // CHECK: 5: [B7.4].operator bool 908 // CHECK: 6: [B7.4] 909 // CHECK: 7: [B7.6] (ImplicitCastExpr, UserDefinedConversion, _Bool) 910 // CHECK: T: [B7.7] ? ... : ... 911 // CHECK: Preds (2): B8 B9 912 // CHECK: Succs (2): B5 B6 913 // CHECK: [B8] 914 // CHECK: 1: ~A() (Temporary object destructor) 915 // CHECK: Preds (1): B9 916 // CHECK: Succs (1): B7 917 // CHECK: [B9] 918 // CHECK: 1: [B12.2] ?: [B11.6] 919 // CHECK: 2: [B9.1] (ImplicitCastExpr, NoOp, const class A) 920 // CHECK: 3: [B9.2] 921 // CHECK: 4: const A &a = A() ?: A(); 922 // CHECK: T: (Temp Dtor) [B11.2] 923 // CHECK: Preds (2): B10 B11 924 // CHECK: Succs (2): B8 B7 925 // CHECK: [B10] 926 // CHECK: 1: [B12.2] (ImplicitCastExpr, NoOp, const class A) 927 // CHECK: 2: [B10.1] 928 // CHECK: 3: [B10.2] (CXXConstructExpr, class A) 929 // CHECK: 4: [B10.3] (BindTemporary) 930 // CHECK: Preds (1): B12 931 // CHECK: Succs (1): B9 932 // CHECK: [B11] 933 // CHECK: 1: A() (CXXConstructExpr, class A) 934 // CHECK: 2: [B11.1] (BindTemporary) 935 // CHECK: 3: [B11.2] (ImplicitCastExpr, NoOp, const class A) 936 // CHECK: 4: [B11.3] 937 // CHECK: 5: [B11.4] (CXXConstructExpr, class A) 938 // CHECK: 6: [B11.5] (BindTemporary) 939 // CHECK: Preds (1): B12 940 // CHECK: Succs (1): B9 941 // CHECK: [B12] 942 // CHECK: 1: A() (CXXConstructExpr, class A) 943 // CHECK: 2: [B12.1] (BindTemporary) 944 // CHECK: 3: [B12.2].operator bool 945 // CHECK: 4: [B12.2] 946 // CHECK: 5: [B12.4] (ImplicitCastExpr, UserDefinedConversion, _Bool) 947 // CHECK: T: [B12.5] ? ... : ... 948 // CHECK: Preds (1): B13 949 // CHECK: Succs (2): B10 B11 950 // CHECK: [B0 (EXIT)] 951 // CHECK: Preds (1): B1 952 // CHECK: [B2 (ENTRY)] 953 // CHECK: Succs (1): B1 954 // CHECK: [B1] 955 // CHECK: 1: A() (CXXConstructExpr, class A) 956 // CHECK: 2: [B1.1] (BindTemporary) 957 // CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A) 958 // CHECK: 4: [B1.3] 959 // CHECK: 5: [B1.4] (CXXConstructExpr, class A) 960 // CHECK: 6: A a = A(); 961 // CHECK: 7: ~A() (Temporary object destructor) 962 // CHECK: 8: int b; 963 // CHECK: 9: [B1.6].~A() (Implicit destructor) 964 // CHECK: Preds (1): B2 965 // CHECK: Succs (1): B0 966 // CHECK: [B0 (EXIT)] 967 // CHECK: Preds (1): B1 968 // CHECK: [B2 (ENTRY)] 969 // CHECK: Succs (1): B1 970 // CHECK: [B1] 971 // CHECK: 1: A() (CXXConstructExpr, class A) 972 // CHECK: 2: [B1.1] (BindTemporary) 973 // CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A) 974 // CHECK: 4: [B1.3] 975 // CHECK: 5: const A &a = A(); 976 // CHECK: 6: foo 977 // CHECK: 7: [B1.6] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &)) 978 // CHECK: 8: A() (CXXConstructExpr, class A) 979 // CHECK: 9: [B1.8] (BindTemporary) 980 // CHECK: 10: [B1.9] (ImplicitCastExpr, NoOp, const class A) 981 // CHECK: 11: [B1.10] 982 // CHECK: 12: [B1.7]([B1.11]) 983 // CHECK: 13: ~A() (Temporary object destructor) 984 // CHECK: 14: int b; 985 // CHECK: 15: [B1.5].~A() (Implicit destructor) 986 // CHECK: Preds (1): B2 987 // CHECK: Succs (1): B0 988 // CHECK: [B0 (EXIT)] 989 // CHECK: Preds (1): B1 990 // CHECK: [B2 (ENTRY)] 991 // CHECK: Succs (1): B1 992 // CHECK: [B1] 993 // CHECK: 1: A::make 994 // CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void)) 995 // CHECK: 3: [B1.2]() 996 // CHECK: 4: [B1.3] (BindTemporary) 997 // CHECK: 5: [B1.4] (ImplicitCastExpr, NoOp, const class A) 998 // CHECK: 6: [B1.5] 999 // CHECK: 7: [B1.6] (CXXConstructExpr, class A) 1000 // CHECK: 8: A a = A::make(); 1001 // CHECK: 9: ~A() (Temporary object destructor) 1002 // CHECK: 10: int b; 1003 // CHECK: 11: [B1.8].~A() (Implicit destructor) 1004 // CHECK: Preds (1): B2 1005 // CHECK: Succs (1): B0 1006 // CHECK: [B0 (EXIT)] 1007 // CHECK: Preds (1): B1 1008 // CHECK: [B2 (ENTRY)] 1009 // CHECK: Succs (1): B1 1010 // CHECK: [B1] 1011 // CHECK: 1: A::make 1012 // CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void)) 1013 // CHECK: 3: [B1.2]() 1014 // CHECK: 4: [B1.3] (BindTemporary) 1015 // CHECK: 5: [B1.4] (ImplicitCastExpr, NoOp, const class A) 1016 // CHECK: 6: [B1.5] 1017 // CHECK: 7: const A &a = A::make(); 1018 // CHECK: 8: foo 1019 // CHECK: 9: [B1.8] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &)) 1020 // CHECK: 10: A::make 1021 // CHECK: 11: [B1.10] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void)) 1022 // CHECK: 12: [B1.11]() 1023 // CHECK: 13: [B1.12] (BindTemporary) 1024 // CHECK: 14: [B1.13] (ImplicitCastExpr, NoOp, const class A) 1025 // CHECK: 15: [B1.14] 1026 // CHECK: 16: [B1.9]([B1.15]) 1027 // CHECK: 17: ~A() (Temporary object destructor) 1028 // CHECK: 18: int b; 1029 // CHECK: 19: [B1.7].~A() (Implicit destructor) 1030 // CHECK: Preds (1): B2 1031 // CHECK: Succs (1): B0 1032 // CHECK: [B0 (EXIT)] 1033 // CHECK: Preds (1): B1 1034 // CHECK: [B2 (ENTRY)] 1035 // CHECK: Succs (1): B1 1036 // CHECK: [B1] 1037 // CHECK: 1: int a; 1038 // CHECK: 2: A() (CXXConstructExpr, class A) 1039 // CHECK: 3: [B1.2] (BindTemporary) 1040 // CHECK: 4: [B1.3].operator int 1041 // CHECK: 5: [B1.3] 1042 // CHECK: 6: [B1.5] (ImplicitCastExpr, UserDefinedConversion, int) 1043 // CHECK: 7: a 1044 // CHECK: 8: [B1.7] = [B1.6] 1045 // CHECK: 9: ~A() (Temporary object destructor) 1046 // CHECK: 10: int b; 1047 // CHECK: Preds (1): B2 1048 // CHECK: Succs (1): B0 1049 // CHECK: [B0 (EXIT)] 1050 // CHECK: Preds (1): B1 1051 // CHECK: [B2 (ENTRY)] 1052 // CHECK: Succs (1): B1 1053 // CHECK: [B1] 1054 // CHECK: 1: A() (CXXConstructExpr, class A) 1055 // CHECK: 2: [B1.1] (BindTemporary) 1056 // CHECK: 3: [B1.2].operator int 1057 // CHECK: 4: [B1.2] 1058 // CHECK: 5: [B1.4] (ImplicitCastExpr, UserDefinedConversion, int) 1059 // CHECK: 6: int([B1.5]) (CXXFunctionalCastExpr, NoOp, int) 1060 // CHECK: 7: B() (CXXConstructExpr, class B) 1061 // CHECK: 8: [B1.7] (BindTemporary) 1062 // CHECK: 9: [B1.8].operator int 1063 // CHECK: 10: [B1.8] 1064 // CHECK: 11: [B1.10] (ImplicitCastExpr, UserDefinedConversion, int) 1065 // CHECK: 12: int([B1.11]) (CXXFunctionalCastExpr, NoOp, int) 1066 // CHECK: 13: [B1.6] + [B1.12] 1067 // CHECK: 14: a([B1.13]) (Member initializer) 1068 // CHECK: 15: ~B() (Temporary object destructor) 1069 // CHECK: 16: ~A() (Temporary object destructor) 1070 // CHECK: 17: /*implicit*/int() 1071 // CHECK: 18: b([B1.17]) (Member initializer) 1072 // CHECK: Preds (1): B2 1073 // CHECK: Succs (1): B0 1074 // CHECK: [B0 (EXIT)] 1075 // CHECK: Preds (1): B1 1076 // CHECK: [B3 (ENTRY)] 1077 // CHECK: Succs (1): B2 1078 // CHECK: [B1] 1079 // CHECK: 1: int b; 1080 // CHECK: Preds (1): B2(Unreachable) 1081 // CHECK: Succs (1): B0 1082 // CHECK: [B2 (NORETURN)] 1083 // CHECK: 1: int a; 1084 // CHECK: 2: NoReturn() (CXXConstructExpr, class NoReturn) 1085 // CHECK: 3: [B2.2] (BindTemporary) 1086 // CHECK: 4: [B2.3].f 1087 // CHECK: 5: [B2.4]() 1088 // CHECK: 6: ~NoReturn() (Temporary object destructor) 1089 // CHECK: Preds (1): B3 1090 // CHECK: Succs (1): B0 1091 // CHECK: [B0 (EXIT)] 1092 // CHECK: Preds (2): B1 B2 1093 // CHECK: [B3 (ENTRY)] 1094 // CHECK: Succs (1): B2 1095 // CHECK: [B1] 1096 // CHECK: 1: int b; 1097 // CHECK: Preds (1): B2(Unreachable) 1098 // CHECK: Succs (1): B0 1099 // CHECK: [B2 (NORETURN)] 1100 // CHECK: 1: int a; 1101 // CHECK: 2: NoReturn() (CXXConstructExpr, class NoReturn) 1102 // CHECK: 3: [B2.2] (BindTemporary) 1103 // CHECK: 4: 47 1104 // CHECK: 5: ... , [B2.4] 1105 // CHECK: 6: ~NoReturn() (Temporary object destructor) 1106 // CHECK: Preds (1): B3 1107 // CHECK: Succs (1): B0 1108 // CHECK: [B0 (EXIT)] 1109 // CHECK: Preds (2): B1 B2 1110 // CHECK: [B9 (ENTRY)] 1111 // CHECK: Succs (1): B8 1112 // CHECK: [B1] 1113 // CHECK: 1: 0 1114 // CHECK: 2: return [B1.1]; 1115 // CHECK: Preds (2): B3 B8 1116 // CHECK: Succs (1): B0 1117 // CHECK: [B2] 1118 // CHECK: 1: 1 1119 // CHECK: 2: return [B2.1]; 1120 // CHECK: Preds (1): B3 1121 // CHECK: Succs (1): B0 1122 // CHECK: [B3] 1123 // CHECK: T: if [B5.1] 1124 // CHECK: Preds (2): B4(Unreachable) B5 1125 // CHECK: Succs (2): B2 B1 1126 // CHECK: [B4 (NORETURN)] 1127 // CHECK: 1: ~NoReturn() (Temporary object destructor) 1128 // CHECK: Preds (1): B5 1129 // CHECK: Succs (1): B0 1130 // CHECK: [B5] 1131 // CHECK: 1: [B7.3] || [B6.7] 1132 // CHECK: T: (Temp Dtor) [B6.4] 1133 // CHECK: Preds (2): B6 B7 1134 // CHECK: Succs (2): B4 B3 1135 // CHECK: [B6] 1136 // CHECK: 1: check 1137 // CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &)) 1138 // CHECK: 3: NoReturn() (CXXConstructExpr, class NoReturn) 1139 // CHECK: 4: [B6.3] (BindTemporary) 1140 // CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn) 1141 // CHECK: 6: [B6.5] 1142 // CHECK: 7: [B6.2]([B6.6]) 1143 // CHECK: Preds (1): B7 1144 // CHECK: Succs (1): B5 1145 // CHECK: [B7] 1146 // CHECK: 1: value 1147 // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1148 // CHECK: 3: ![B7.2] 1149 // CHECK: T: [B7.3] || ... 1150 // CHECK: Preds (1): B8 1151 // CHECK: Succs (2): B5 B6 1152 // CHECK: [B8] 1153 // CHECK: 1: value 1154 // CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1155 // CHECK: T: if [B8.2] 1156 // CHECK: Preds (1): B9 1157 // CHECK: Succs (2): B7 B1 1158 // CHECK: [B0 (EXIT)] 1159 // CHECK: Preds (3): B1 B2 B4 1160 // CHECK: [B10 (ENTRY)] 1161 // CHECK: Succs (1): B9 1162 // CHECK: [B1] 1163 // CHECK: 1: 0 1164 // CHECK: 2: return [B1.1]; 1165 // CHECK: Preds (2): B3 B9 1166 // CHECK: Succs (1): B0 1167 // CHECK: [B2] 1168 // CHECK: 1: 1 1169 // CHECK: 2: return [B2.1]; 1170 // CHECK: Preds (1): B3 1171 // CHECK: Succs (1): B0 1172 // CHECK: [B3] 1173 // CHECK: T: if [B5.1] 1174 // CHECK: Preds (2): B4(Unreachable) B5 1175 // CHECK: Succs (2): B2 B1 1176 // CHECK: [B4 (NORETURN)] 1177 // CHECK: 1: ~NoReturn() (Temporary object destructor) 1178 // CHECK: Preds (1): B5 1179 // CHECK: Succs (1): B0 1180 // CHECK: [B5] 1181 // CHECK: 1: [B8.3] || [B7.3] || [B6.7] 1182 // CHECK: T: (Temp Dtor) [B6.4] 1183 // CHECK: Preds (3): B6 B7 B8 1184 // CHECK: Succs (2): B4 B3 1185 // CHECK: [B6] 1186 // CHECK: 1: check 1187 // CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &)) 1188 // CHECK: 3: NoReturn() (CXXConstructExpr, class NoReturn) 1189 // CHECK: 4: [B6.3] (BindTemporary) 1190 // CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn) 1191 // CHECK: 6: [B6.5] 1192 // CHECK: 7: [B6.2]([B6.6]) 1193 // CHECK: Preds (1): B7 1194 // CHECK: Succs (1): B5 1195 // CHECK: [B7] 1196 // CHECK: 1: value 1197 // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1198 // CHECK: 3: ![B7.2] 1199 // CHECK: T: [B8.3] || [B7.3] || ... 1200 // CHECK: Preds (1): B8 1201 // CHECK: Succs (2): B5 B6 1202 // CHECK: [B8] 1203 // CHECK: 1: value 1204 // CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1205 // CHECK: 3: ![B8.2] 1206 // CHECK: T: [B8.3] || ... 1207 // CHECK: Preds (1): B9 1208 // CHECK: Succs (2): B5 B7 1209 // CHECK: [B9] 1210 // CHECK: 1: value 1211 // CHECK: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1212 // CHECK: T: if [B9.2] 1213 // CHECK: Preds (1): B10 1214 // CHECK: Succs (2): B8 B1 1215 // CHECK: [B0 (EXIT)] 1216 // CHECK: Preds (3): B1 B2 B4 1217 // CHECK: [B10 (ENTRY)] 1218 // CHECK: Succs (1): B9 1219 // CHECK: [B1] 1220 // CHECK: 1: 0 1221 // CHECK: 2: return [B1.1]; 1222 // CHECK: Preds (2): B3 B9 1223 // CHECK: Succs (1): B0 1224 // CHECK: [B2] 1225 // CHECK: 1: 1 1226 // CHECK: 2: return [B2.1]; 1227 // CHECK: Preds (1): B3 1228 // CHECK: Succs (1): B0 1229 // CHECK: [B3] 1230 // CHECK: T: if [B5.1] 1231 // CHECK: Preds (2): B4(Unreachable) B5 1232 // CHECK: Succs (2): B2 B1 1233 // CHECK: [B4 (NORETURN)] 1234 // CHECK: 1: ~NoReturn() (Temporary object destructor) 1235 // CHECK: Preds (1): B5 1236 // CHECK: Succs (1): B0 1237 // CHECK: [B5] 1238 // CHECK: 1: [B8.3] || [B7.2] || [B6.7] 1239 // CHECK: T: (Temp Dtor) [B6.4] 1240 // CHECK: Preds (3): B6 B7 B8 1241 // CHECK: Succs (2): B4 B3 1242 // CHECK: [B6] 1243 // CHECK: 1: check 1244 // CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &)) 1245 // CHECK: 3: NoReturn() (CXXConstructExpr, class NoReturn) 1246 // CHECK: 4: [B6.3] (BindTemporary) 1247 // CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn) 1248 // CHECK: 6: [B6.5] 1249 // CHECK: 7: [B6.2]([B6.6]) 1250 // CHECK: Preds (1): B7 1251 // CHECK: Succs (1): B5 1252 // CHECK: [B7] 1253 // CHECK: 1: value 1254 // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1255 // CHECK: T: [B8.3] || [B7.2] || ... 1256 // CHECK: Preds (1): B8 1257 // CHECK: Succs (2): B5 B6 1258 // CHECK: [B8] 1259 // CHECK: 1: value 1260 // CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1261 // CHECK: 3: ![B8.2] 1262 // CHECK: T: [B8.3] || ... 1263 // CHECK: Preds (1): B9 1264 // CHECK: Succs (2): B5 B7 1265 // CHECK: [B9] 1266 // CHECK: 1: value 1267 // CHECK: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1268 // CHECK: T: if [B9.2] 1269 // CHECK: Preds (1): B10 1270 // CHECK: Succs (2): B8 B1 1271 // CHECK: [B0 (EXIT)] 1272 // CHECK: Preds (3): B1 B2 B4 1273