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