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