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