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