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