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