auto-obj-dtors-cfg-output.cpp revision 8ae6058cecba902c0069c24bdc9c26d475559291
1// RUN: %clang_cc1 -analyze -cfg-dump -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_scope() { 20 A a; 21 { A c; 22 A d; 23 } 24 A b; 25} 26 27void test_return() { 28 A a; 29 A b; 30 if (UV) return; 31 A c; 32} 33 34void test_goto() { 35 A a; 36l0: 37 A b; 38 { A a; 39 if (UV) goto l0; 40 if (UV) goto l1; 41 A b; 42 } 43l1: 44 A c; 45} 46 47void test_if_implicit_scope() { 48 A a; 49 if (A b = a) 50 A c; 51 else A c; 52} 53 54void test_if_jumps() { 55 A a; 56 if (A b = a) { 57 A c; 58 if (UV) return; 59 A d; 60 } else { 61 A c; 62 if (UV) return; 63 A d; 64 } 65 A e; 66} 67 68void test_while_implicit_scope() { 69 A a; 70 while (A b = a) 71 A c; 72} 73 74void test_while_jumps() { 75 A a; 76 while (A b = a) { 77 A c; 78 if (UV) break; 79 if (UV) continue; 80 if (UV) return; 81 A d; 82 } 83 A e; 84} 85 86void test_do_implicit_scope() { 87 do A a; 88 while (UV); 89} 90 91void test_do_jumps() { 92 A a; 93 do { 94 A b; 95 if (UV) break; 96 if (UV) continue; 97 if (UV) return; 98 A c; 99 } while (UV); 100 A d; 101} 102 103void test_switch_implicit_scope() { 104 A a; 105 switch (A b = a) 106 A c; 107} 108 109void test_switch_jumps() { 110 A a; 111 switch (A b = a) { 112 case 0: { 113 A c; 114 if (UV) break; 115 if (UV) return; 116 A f; 117 } 118 case 1: 119 break; 120 } 121 A g; 122} 123 124// CHECK: [ B2 (ENTRY) ] 125// CHECK: Predecessors (0): 126// CHECK: Successors (1): B1 127// CHECK: [ B1 ] 128// CHECK: 1: A a; 129// CHECK: 2: const A &b = a; 130// CHECK: 3: const A &c = A(); 131// CHECK: 4: [B1.3].~A() (Implicit destructor) 132// CHECK: 5: [B1.1].~A() (Implicit destructor) 133// CHECK: Predecessors (1): B2 134// CHECK: Successors (1): B0 135// CHECK: [ B0 (EXIT) ] 136// CHECK: Predecessors (1): B1 137// CHECK: Successors (0): 138// CHECK: [ B2 (ENTRY) ] 139// CHECK: Predecessors (0): 140// CHECK: Successors (1): B1 141// CHECK: [ B1 ] 142// CHECK: 1: A a; 143// CHECK: 2: A c; 144// CHECK: 3: A d; 145// CHECK: 4: [B1.3].~A() (Implicit destructor) 146// CHECK: 5: [B1.2].~A() (Implicit destructor) 147// CHECK: 6: A b; 148// CHECK: 7: [B1.6].~A() (Implicit destructor) 149// CHECK: 8: [B1.1].~A() (Implicit destructor) 150// CHECK: Predecessors (1): B2 151// CHECK: Successors (1): B0 152// CHECK: [ B0 (EXIT) ] 153// CHECK: Predecessors (1): B1 154// CHECK: Successors (0): 155// CHECK: [ B4 (ENTRY) ] 156// CHECK: Predecessors (0): 157// CHECK: Successors (1): B3 158// CHECK: [ B1 ] 159// CHECK: 1: A c; 160// CHECK: 2: [B1.1].~A() (Implicit destructor) 161// CHECK: 3: [B3.2].~A() (Implicit destructor) 162// CHECK: 4: [B3.1].~A() (Implicit destructor) 163// CHECK: Predecessors (1): B3 164// CHECK: Successors (1): B0 165// CHECK: [ B2 ] 166// CHECK: 1: return; 167// CHECK: 2: [B3.2].~A() (Implicit destructor) 168// CHECK: 3: [B3.1].~A() (Implicit destructor) 169// CHECK: Predecessors (1): B3 170// CHECK: Successors (1): B0 171// CHECK: [ B3 ] 172// CHECK: 1: A a; 173// CHECK: 2: A b; 174// CHECK: 3: UV 175// CHECK: T: if [B3.3] 176// CHECK: Predecessors (1): B4 177// CHECK: Successors (2): B2 B1 178// CHECK: [ B0 (EXIT) ] 179// CHECK: Predecessors (2): B1 B2 180// CHECK: Successors (0): 181// CHECK: [ B8 (ENTRY) ] 182// CHECK: Predecessors (0): 183// CHECK: Successors (1): B7 184// CHECK: [ B1 ] 185// CHECK: l1: 186// CHECK: 1: A c; 187// CHECK: 2: [B1.1].~A() (Implicit destructor) 188// CHECK: 3: [B6.1].~A() (Implicit destructor) 189// CHECK: 4: [B7.1].~A() (Implicit destructor) 190// CHECK: Predecessors (2): B2 B3 191// CHECK: Successors (1): B0 192// CHECK: [ B2 ] 193// CHECK: 1: A b; 194// CHECK: 2: [B2.1].~A() (Implicit destructor) 195// CHECK: 3: [B6.2].~A() (Implicit destructor) 196// CHECK: Predecessors (1): B4 197// CHECK: Successors (1): B1 198// CHECK: [ B3 ] 199// CHECK: 1: [B6.2].~A() (Implicit destructor) 200// CHECK: T: goto l1; 201// CHECK: Predecessors (1): B4 202// CHECK: Successors (1): B1 203// CHECK: [ B4 ] 204// CHECK: 1: UV 205// CHECK: T: if [B4.1] 206// CHECK: Predecessors (1): B6 207// CHECK: Successors (2): B3 B2 208// CHECK: [ B5 ] 209// CHECK: 1: [B6.2].~A() (Implicit destructor) 210// CHECK: 2: [B6.1].~A() (Implicit destructor) 211// CHECK: T: goto l0; 212// CHECK: Predecessors (1): B6 213// CHECK: Successors (1): B6 214// CHECK: [ B6 ] 215// CHECK: l0: 216// CHECK: 1: A b; 217// CHECK: 2: A a; 218// CHECK: 3: UV 219// CHECK: T: if [B6.3] 220// CHECK: Predecessors (2): B7 B5 221// CHECK: Successors (2): B5 B4 222// CHECK: [ B7 ] 223// CHECK: 1: A a; 224// CHECK: Predecessors (1): B8 225// CHECK: Successors (1): B6 226// CHECK: [ B0 (EXIT) ] 227// CHECK: Predecessors (1): B1 228// CHECK: Successors (0): 229// CHECK: [ B5 (ENTRY) ] 230// CHECK: Predecessors (0): 231// CHECK: Successors (1): B4 232// CHECK: [ B1 ] 233// CHECK: 1: [B4.3].~A() (Implicit destructor) 234// CHECK: 2: [B4.1].~A() (Implicit destructor) 235// CHECK: Predecessors (2): B2 B3 236// CHECK: Successors (1): B0 237// CHECK: [ B2 ] 238// CHECK: 1: A c; 239// CHECK: 2: [B2.1].~A() (Implicit destructor) 240// CHECK: Predecessors (1): B4 241// CHECK: Successors (1): B1 242// CHECK: [ B3 ] 243// CHECK: 1: A c; 244// CHECK: 2: [B3.1].~A() (Implicit destructor) 245// CHECK: Predecessors (1): B4 246// CHECK: Successors (1): B1 247// CHECK: [ B4 ] 248// CHECK: 1: A a; 249// CHECK: 2: a 250// CHECK: 3: if ([B4.5]) 251// CHECK: [B3.1]else 252// CHECK: [B2.1] 4: b.operator int() 253// CHECK: 5: [B4.4] 254// CHECK: T: if [B4.5] 255// CHECK: Predecessors (1): B5 256// CHECK: Successors (2): B3 B2 257// CHECK: [ B0 (EXIT) ] 258// CHECK: Predecessors (1): B1 259// CHECK: Successors (0): 260// CHECK: [ B9 (ENTRY) ] 261// CHECK: Predecessors (0): 262// CHECK: Successors (1): B8 263// CHECK: [ B1 ] 264// CHECK: 1: [B8.3].~A() (Implicit destructor) 265// CHECK: 2: A e; 266// CHECK: 3: [B1.2].~A() (Implicit destructor) 267// CHECK: 4: [B8.1].~A() (Implicit destructor) 268// CHECK: Predecessors (2): B2 B5 269// CHECK: Successors (1): B0 270// CHECK: [ B2 ] 271// CHECK: 1: A d; 272// CHECK: 2: [B2.1].~A() (Implicit destructor) 273// CHECK: 3: [B4.1].~A() (Implicit destructor) 274// CHECK: Predecessors (1): B4 275// CHECK: Successors (1): B1 276// CHECK: [ B3 ] 277// CHECK: 1: return; 278// CHECK: 2: [B4.1].~A() (Implicit destructor) 279// CHECK: 3: [B8.3].~A() (Implicit destructor) 280// CHECK: 4: [B8.1].~A() (Implicit destructor) 281// CHECK: Predecessors (1): B4 282// CHECK: Successors (1): B0 283// CHECK: [ B4 ] 284// CHECK: 1: A c; 285// CHECK: 2: UV 286// CHECK: T: if [B4.2] 287// CHECK: Predecessors (1): B8 288// CHECK: Successors (2): B3 B2 289// CHECK: [ B5 ] 290// CHECK: 1: A d; 291// CHECK: 2: [B5.1].~A() (Implicit destructor) 292// CHECK: 3: [B7.1].~A() (Implicit destructor) 293// CHECK: Predecessors (1): B7 294// CHECK: Successors (1): B1 295// CHECK: [ B6 ] 296// CHECK: 1: return; 297// CHECK: 2: [B7.1].~A() (Implicit destructor) 298// CHECK: 3: [B8.3].~A() (Implicit destructor) 299// CHECK: 4: [B8.1].~A() (Implicit destructor) 300// CHECK: Predecessors (1): B7 301// CHECK: Successors (1): B0 302// CHECK: [ B7 ] 303// CHECK: 1: A c; 304// CHECK: 2: UV 305// CHECK: T: if [B7.2] 306// CHECK: Predecessors (1): B8 307// CHECK: Successors (2): B6 B5 308// CHECK: [ B8 ] 309// CHECK: 1: A a; 310// CHECK: 2: a 311// CHECK: 3: if ([B8.5]) { 312// CHECK: [B7.1] if ([B7.2]) 313// CHECK: [B6.1][B5.1]} else { 314// CHECK: [B4.1] if ([B4.2]) 315// CHECK: [B3.1][B2.1]} 316// CHECK: 4: b.operator int() 317// CHECK: 5: [B8.4] 318// CHECK: T: if [B8.5] 319// CHECK: Predecessors (1): B9 320// CHECK: Successors (2): B7 B4 321// CHECK: [ B0 (EXIT) ] 322// CHECK: Predecessors (3): B1 B3 B6 323// CHECK: Successors (0): 324// CHECK: [ B6 (ENTRY) ] 325// CHECK: Predecessors (0): 326// CHECK: Successors (1): B5 327// CHECK: [ B1 ] 328// CHECK: 1: [B2.2].~A() (Implicit destructor) 329// CHECK: 2: [B5.1].~A() (Implicit destructor) 330// CHECK: Predecessors (1): B2 331// CHECK: Successors (1): B0 332// CHECK: [ B2 ] 333// CHECK: 1: a 334// CHECK: 2: while ([B2.4]) 335// CHECK: [B4.1] 3: b.operator int() 336// CHECK: 4: [B2.3] 337// CHECK: T: while [B2.4] 338// CHECK: Predecessors (2): B3 B5 339// CHECK: Successors (2): B4 B1 340// CHECK: [ B3 ] 341// CHECK: Predecessors (1): B4 342// CHECK: Successors (1): B2 343// CHECK: [ B4 ] 344// CHECK: 1: A c; 345// CHECK: 2: [B4.1].~A() (Implicit destructor) 346// CHECK: 3: [B2.2].~A() (Implicit destructor) 347// CHECK: Predecessors (1): B2 348// CHECK: Successors (1): B3 349// CHECK: [ B5 ] 350// CHECK: 1: A a; 351// CHECK: Predecessors (1): B6 352// CHECK: Successors (1): B2 353// CHECK: [ B0 (EXIT) ] 354// CHECK: Predecessors (1): B1 355// CHECK: Successors (0): 356// CHECK: [ B12 (ENTRY) ] 357// CHECK: Predecessors (0): 358// CHECK: Successors (1): B11 359// CHECK: [ B1 ] 360// CHECK: 1: [B2.2].~A() (Implicit destructor) 361// CHECK: 2: A e; 362// CHECK: 3: [B1.2].~A() (Implicit destructor) 363// CHECK: 4: [B11.1].~A() (Implicit destructor) 364// CHECK: Predecessors (2): B9 B2 365// CHECK: Successors (1): B0 366// CHECK: [ B2 ] 367// CHECK: 1: a 368// CHECK: 2: while ([B2.4]) 369// CHECK: { 370// CHECK: [B10.1] if ([B10.2]) 371// CHECK: break; 372// CHECK: if ([B8.1]) 373// CHECK: continue; 374// CHECK: if ([B6.1]) 375// CHECK: [B5.1][B4.1] } 376// CHECK: 3: b.operator int() 377// CHECK: 4: [B2.3] 378// CHECK: T: while [B2.4] 379// CHECK: Predecessors (2): B3 B11 380// CHECK: Successors (2): B10 B1 381// CHECK: [ B3 ] 382// CHECK: Predecessors (2): B4 B7 383// CHECK: Successors (1): B2 384// CHECK: [ B4 ] 385// CHECK: 1: A d; 386// CHECK: 2: [B4.1].~A() (Implicit destructor) 387// CHECK: 3: [B10.1].~A() (Implicit destructor) 388// CHECK: 4: [B2.2].~A() (Implicit destructor) 389// CHECK: Predecessors (1): B6 390// CHECK: Successors (1): B3 391// CHECK: [ B5 ] 392// CHECK: 1: return; 393// CHECK: 2: [B10.1].~A() (Implicit destructor) 394// CHECK: 3: [B2.2].~A() (Implicit destructor) 395// CHECK: 4: [B11.1].~A() (Implicit destructor) 396// CHECK: Predecessors (1): B6 397// CHECK: Successors (1): B0 398// CHECK: [ B6 ] 399// CHECK: 1: UV 400// CHECK: T: if [B6.1] 401// CHECK: Predecessors (1): B8 402// CHECK: Successors (2): B5 B4 403// CHECK: [ B7 ] 404// CHECK: 1: [B10.1].~A() (Implicit destructor) 405// CHECK: 2: [B2.2].~A() (Implicit destructor) 406// CHECK: T: continue; 407// CHECK: Predecessors (1): B8 408// CHECK: Successors (1): B3 409// CHECK: [ B8 ] 410// CHECK: 1: UV 411// CHECK: T: if [B8.1] 412// CHECK: Predecessors (1): B10 413// CHECK: Successors (2): B7 B6 414// CHECK: [ B9 ] 415// CHECK: 1: [B10.1].~A() (Implicit destructor) 416// CHECK: T: break; 417// CHECK: Predecessors (1): B10 418// CHECK: Successors (1): B1 419// CHECK: [ B10 ] 420// CHECK: 1: A c; 421// CHECK: 2: UV 422// CHECK: T: if [B10.2] 423// CHECK: Predecessors (1): B2 424// CHECK: Successors (2): B9 B8 425// CHECK: [ B11 ] 426// CHECK: 1: A a; 427// CHECK: Predecessors (1): B12 428// CHECK: Successors (1): B2 429// CHECK: [ B0 (EXIT) ] 430// CHECK: Predecessors (2): B1 B5 431// CHECK: Successors (0): 432// CHECK: [ B4 (ENTRY) ] 433// CHECK: Predecessors (0): 434// CHECK: Successors (1): B2 435// CHECK: [ B1 ] 436// CHECK: 1: UV 437// CHECK: T: do ... while [B1.1] 438// CHECK: Predecessors (1): B2 439// CHECK: Successors (2): B3 B0 440// CHECK: [ B2 ] 441// CHECK: 1: A a; 442// CHECK: 2: [B2.1].~A() (Implicit destructor) 443// CHECK: Predecessors (2): B3 B4 444// CHECK: Successors (1): B1 445// CHECK: [ B3 ] 446// CHECK: Predecessors (1): B1 447// CHECK: Successors (1): B2 448// CHECK: [ B0 (EXIT) ] 449// CHECK: Predecessors (1): B1 450// CHECK: Successors (0): 451// CHECK: [ B12 (ENTRY) ] 452// CHECK: Predecessors (0): 453// CHECK: Successors (1): B11 454// CHECK: [ B1 ] 455// CHECK: 1: A d; 456// CHECK: 2: [B1.1].~A() (Implicit destructor) 457// CHECK: 3: [B11.1].~A() (Implicit destructor) 458// CHECK: Predecessors (2): B8 B2 459// CHECK: Successors (1): B0 460// CHECK: [ B2 ] 461// CHECK: 1: UV 462// CHECK: T: do ... while [B2.1] 463// CHECK: Predecessors (2): B3 B6 464// CHECK: Successors (2): B10 B1 465// CHECK: [ B3 ] 466// CHECK: 1: A c; 467// CHECK: 2: [B3.1].~A() (Implicit destructor) 468// CHECK: 3: [B9.1].~A() (Implicit destructor) 469// CHECK: Predecessors (1): B5 470// CHECK: Successors (1): B2 471// CHECK: [ B4 ] 472// CHECK: 1: return; 473// CHECK: 2: [B9.1].~A() (Implicit destructor) 474// CHECK: 3: [B11.1].~A() (Implicit destructor) 475// CHECK: Predecessors (1): B5 476// CHECK: Successors (1): B0 477// CHECK: [ B5 ] 478// CHECK: 1: UV 479// CHECK: T: if [B5.1] 480// CHECK: Predecessors (1): B7 481// CHECK: Successors (2): B4 B3 482// CHECK: [ B6 ] 483// CHECK: 1: [B9.1].~A() (Implicit destructor) 484// CHECK: T: continue; 485// CHECK: Predecessors (1): B7 486// CHECK: Successors (1): B2 487// CHECK: [ B7 ] 488// CHECK: 1: UV 489// CHECK: T: if [B7.1] 490// CHECK: Predecessors (1): B9 491// CHECK: Successors (2): B6 B5 492// CHECK: [ B8 ] 493// CHECK: 1: [B9.1].~A() (Implicit destructor) 494// CHECK: T: break; 495// CHECK: Predecessors (1): B9 496// CHECK: Successors (1): B1 497// CHECK: [ B9 ] 498// CHECK: 1: A b; 499// CHECK: 2: UV 500// CHECK: T: if [B9.2] 501// CHECK: Predecessors (2): B10 B11 502// CHECK: Successors (2): B8 B7 503// CHECK: [ B10 ] 504// CHECK: Predecessors (1): B2 505// CHECK: Successors (1): B9 506// CHECK: [ B11 ] 507// CHECK: 1: A a; 508// CHECK: Predecessors (1): B12 509// CHECK: Successors (1): B9 510// CHECK: [ B0 (EXIT) ] 511// CHECK: Predecessors (2): B1 B4 512// CHECK: Successors (0): 513// CHECK: [ B4 (ENTRY) ] 514// CHECK: Predecessors (0): 515// CHECK: Successors (1): B2 516// CHECK: [ B1 ] 517// CHECK: 1: [B2.3].~A() (Implicit destructor) 518// CHECK: 2: [B2.1].~A() (Implicit destructor) 519// CHECK: Predecessors (2): B3 B2 520// CHECK: Successors (1): B0 521// CHECK: [ B2 ] 522// CHECK: 1: A a; 523// CHECK: 2: a 524// CHECK: 3: switch ([B2.4]) 525// CHECK: [B3.1] 4: b.operator int() 526// CHECK: T: switch [B2.4] 527// CHECK: Predecessors (1): B4 528// CHECK: Successors (1): B1 529// CHECK: [ B3 ] 530// CHECK: 1: A c; 531// CHECK: 2: [B3.1].~A() (Implicit destructor) 532// CHECK: Predecessors (0): 533// CHECK: Successors (1): B1 534// CHECK: [ B0 (EXIT) ] 535// CHECK: Predecessors (1): B1 536// CHECK: Successors (0): 537// CHECK: [ B9 (ENTRY) ] 538// CHECK: Predecessors (0): 539// CHECK: Successors (1): B2 540// CHECK: [ B1 ] 541// CHECK: 1: [B2.3].~A() (Implicit destructor) 542// CHECK: 2: A g; 543// CHECK: 3: [B1.2].~A() (Implicit destructor) 544// CHECK: 4: [B2.1].~A() (Implicit destructor) 545// CHECK: Predecessors (3): B3 B7 B2 546// CHECK: Successors (1): B0 547// CHECK: [ B2 ] 548// CHECK: 1: A a; 549// CHECK: 2: a 550// CHECK: 3: switch ([B2.4]) { 551// CHECK: case 0: 552// CHECK: { 553// CHECK: [B8.1] if ([B8.2]) 554// CHECK: break; 555// CHECK: if ([B6.1]) 556// CHECK: [B5.1][B4.1] } 557// CHECK: case 1: 558// CHECK: break; 559// CHECK: } 560// CHECK: 4: b.operator int() 561// CHECK: T: switch [B2.4] 562// CHECK: Predecessors (1): B9 563// CHECK: Successors (3): B3 B8 564// CHECK: B1 565// CHECK: [ B3 ] 566// CHECK: case 1: 567// CHECK: T: break; 568// CHECK: Predecessors (2): B2 B4 569// CHECK: Successors (1): B1 570// CHECK: [ B4 ] 571// CHECK: 1: A f; 572// CHECK: 2: [B4.1].~A() (Implicit destructor) 573// CHECK: 3: [B8.1].~A() (Implicit destructor) 574// CHECK: Predecessors (1): B6 575// CHECK: Successors (1): B3 576// CHECK: [ B5 ] 577// CHECK: 1: return; 578// CHECK: 2: [B8.1].~A() (Implicit destructor) 579// CHECK: 3: [B2.3].~A() (Implicit destructor) 580// CHECK: 4: [B2.1].~A() (Implicit destructor) 581// CHECK: Predecessors (1): B6 582// CHECK: Successors (1): B0 583// CHECK: [ B6 ] 584// CHECK: 1: UV 585// CHECK: T: if [B6.1] 586// CHECK: Predecessors (1): B8 587// CHECK: Successors (2): B5 B4 588// CHECK: [ B7 ] 589// CHECK: 1: [B8.1].~A() (Implicit destructor) 590// CHECK: T: break; 591// CHECK: Predecessors (1): B8 592// CHECK: Successors (1): B1 593// CHECK: [ B8 ] 594// CHECK: case 0: 595// CHECK: 1: A c; 596// CHECK: 2: UV 597// CHECK: T: if [B8.2] 598// CHECK: Predecessors (1): B2 599// CHECK: Successors (2): B7 B6 600// CHECK: [ B0 (EXIT) ] 601// CHECK: Predecessors (2): B1 B5 602// CHECK: Successors (0): 603