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