auto-obj-dtors-cfg-output.cpp revision 05adedcb5e199e377e35f576288caf5ceed40136
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 103// CHECK: [ B2 (ENTRY) ] 104// CHECK: Predecessors (0): 105// CHECK: Successors (1): B1 106// CHECK: [ B1 ] 107// CHECK: 1: A a; 108// CHECK: 2: const A &b = a; 109// CHECK: 3: const A &c = A(); 110// CHECK: 4: [B1.3].~A() (Implicit destructor) 111// CHECK: 5: [B1.1].~A() (Implicit destructor) 112// CHECK: Predecessors (1): B2 113// CHECK: Successors (1): B0 114// CHECK: [ B0 (EXIT) ] 115// CHECK: Predecessors (1): B1 116// CHECK: Successors (0): 117// CHECK: [ B2 (ENTRY) ] 118// CHECK: Predecessors (0): 119// CHECK: Successors (1): B1 120// CHECK: [ B1 ] 121// CHECK: 1: A a; 122// CHECK: 2: A c; 123// CHECK: 3: A d; 124// CHECK: 4: [B1.3].~A() (Implicit destructor) 125// CHECK: 5: [B1.2].~A() (Implicit destructor) 126// CHECK: 6: A b; 127// CHECK: 7: [B1.6].~A() (Implicit destructor) 128// CHECK: 8: [B1.1].~A() (Implicit destructor) 129// CHECK: Predecessors (1): B2 130// CHECK: Successors (1): B0 131// CHECK: [ B0 (EXIT) ] 132// CHECK: Predecessors (1): B1 133// CHECK: Successors (0): 134// CHECK: [ B4 (ENTRY) ] 135// CHECK: Predecessors (0): 136// CHECK: Successors (1): B3 137// CHECK: [ B1 ] 138// CHECK: 1: A c; 139// CHECK: 2: [B1.1].~A() (Implicit destructor) 140// CHECK: 3: [B3.2].~A() (Implicit destructor) 141// CHECK: 4: [B3.1].~A() (Implicit destructor) 142// CHECK: Predecessors (1): B3 143// CHECK: Successors (1): B0 144// CHECK: [ B2 ] 145// CHECK: 1: return; 146// CHECK: 2: [B3.2].~A() (Implicit destructor) 147// CHECK: 3: [B3.1].~A() (Implicit destructor) 148// CHECK: Predecessors (1): B3 149// CHECK: Successors (1): B0 150// CHECK: [ B3 ] 151// CHECK: 1: A a; 152// CHECK: 2: A b; 153// CHECK: 3: UV 154// CHECK: T: if [B3.3] 155// CHECK: Predecessors (1): B4 156// CHECK: Successors (2): B2 B1 157// CHECK: [ B0 (EXIT) ] 158// CHECK: Predecessors (2): B1 B2 159// CHECK: Successors (0): 160// CHECK: [ B8 (ENTRY) ] 161// CHECK: Predecessors (0): 162// CHECK: Successors (1): B7 163// CHECK: [ B1 ] 164// CHECK: l1: 165// CHECK: 1: A c; 166// CHECK: 2: [B1.1].~A() (Implicit destructor) 167// CHECK: 3: [B6.1].~A() (Implicit destructor) 168// CHECK: 4: [B7.1].~A() (Implicit destructor) 169// CHECK: Predecessors (2): B2 B3 170// CHECK: Successors (1): B0 171// CHECK: [ B2 ] 172// CHECK: 1: A b; 173// CHECK: 2: [B2.1].~A() (Implicit destructor) 174// CHECK: 3: [B6.2].~A() (Implicit destructor) 175// CHECK: Predecessors (1): B4 176// CHECK: Successors (1): B1 177// CHECK: [ B3 ] 178// CHECK: 1: [B6.2].~A() (Implicit destructor) 179// CHECK: T: goto l1; 180// CHECK: Predecessors (1): B4 181// CHECK: Successors (1): B1 182// CHECK: [ B4 ] 183// CHECK: 1: UV 184// CHECK: T: if [B4.1] 185// CHECK: Predecessors (1): B6 186// CHECK: Successors (2): B3 B2 187// CHECK: [ B5 ] 188// CHECK: 1: [B6.2].~A() (Implicit destructor) 189// CHECK: 2: [B6.1].~A() (Implicit destructor) 190// CHECK: T: goto l0; 191// CHECK: Predecessors (1): B6 192// CHECK: Successors (1): B6 193// CHECK: [ B6 ] 194// CHECK: l0: 195// CHECK: 1: A b; 196// CHECK: 2: A a; 197// CHECK: 3: UV 198// CHECK: T: if [B6.3] 199// CHECK: Predecessors (2): B7 B5 200// CHECK: Successors (2): B5 B4 201// CHECK: [ B7 ] 202// CHECK: 1: A a; 203// CHECK: Predecessors (1): B8 204// CHECK: Successors (1): B6 205// CHECK: [ B0 (EXIT) ] 206// CHECK: Predecessors (1): B1 207// CHECK: Successors (0): 208// CHECK: [ B5 (ENTRY) ] 209// CHECK: Predecessors (0): 210// CHECK: Successors (1): B4 211// CHECK: [ B1 ] 212// CHECK: 1: [B4.3].~A() (Implicit destructor) 213// CHECK: 2: [B4.1].~A() (Implicit destructor) 214// CHECK: Predecessors (2): B2 B3 215// CHECK: Successors (1): B0 216// CHECK: [ B2 ] 217// CHECK: 1: A c; 218// CHECK: 2: [B2.1].~A() (Implicit destructor) 219// CHECK: Predecessors (1): B4 220// CHECK: Successors (1): B1 221// CHECK: [ B3 ] 222// CHECK: 1: A c; 223// CHECK: 2: [B3.1].~A() (Implicit destructor) 224// CHECK: Predecessors (1): B4 225// CHECK: Successors (1): B1 226// CHECK: [ B4 ] 227// CHECK: 1: A a; 228// CHECK: 2: a 229// CHECK: 3: if ([B4.5]) 230// CHECK: [B3.1]else 231// CHECK: [B2.1] 4: b.operator int() 232// CHECK: 5: [B4.4] 233// CHECK: T: if [B4.5] 234// CHECK: Predecessors (1): B5 235// CHECK: Successors (2): B3 B2 236// CHECK: [ B0 (EXIT) ] 237// CHECK: Predecessors (1): B1 238// CHECK: Successors (0): 239// CHECK: [ B9 (ENTRY) ] 240// CHECK: Predecessors (0): 241// CHECK: Successors (1): B8 242// CHECK: [ B1 ] 243// CHECK: 1: [B8.3].~A() (Implicit destructor) 244// CHECK: 2: A e; 245// CHECK: 3: [B1.2].~A() (Implicit destructor) 246// CHECK: 4: [B8.1].~A() (Implicit destructor) 247// CHECK: Predecessors (2): B2 B5 248// CHECK: Successors (1): B0 249// CHECK: [ B2 ] 250// CHECK: 1: A d; 251// CHECK: 2: [B2.1].~A() (Implicit destructor) 252// CHECK: 3: [B4.1].~A() (Implicit destructor) 253// CHECK: Predecessors (1): B4 254// CHECK: Successors (1): B1 255// CHECK: [ B3 ] 256// CHECK: 1: return; 257// CHECK: 2: [B4.1].~A() (Implicit destructor) 258// CHECK: 3: [B8.3].~A() (Implicit destructor) 259// CHECK: 4: [B8.1].~A() (Implicit destructor) 260// CHECK: Predecessors (1): B4 261// CHECK: Successors (1): B0 262// CHECK: [ B4 ] 263// CHECK: 1: A c; 264// CHECK: 2: UV 265// CHECK: T: if [B4.2] 266// CHECK: Predecessors (1): B8 267// CHECK: Successors (2): B3 B2 268// CHECK: [ B5 ] 269// CHECK: 1: A d; 270// CHECK: 2: [B5.1].~A() (Implicit destructor) 271// CHECK: 3: [B7.1].~A() (Implicit destructor) 272// CHECK: Predecessors (1): B7 273// CHECK: Successors (1): B1 274// CHECK: [ B6 ] 275// CHECK: 1: return; 276// CHECK: 2: [B7.1].~A() (Implicit destructor) 277// CHECK: 3: [B8.3].~A() (Implicit destructor) 278// CHECK: 4: [B8.1].~A() (Implicit destructor) 279// CHECK: Predecessors (1): B7 280// CHECK: Successors (1): B0 281// CHECK: [ B7 ] 282// CHECK: 1: A c; 283// CHECK: 2: UV 284// CHECK: T: if [B7.2] 285// CHECK: Predecessors (1): B8 286// CHECK: Successors (2): B6 B5 287// CHECK: [ B8 ] 288// CHECK: 1: A a; 289// CHECK: 2: a 290// CHECK: 3: if ([B8.5]) { 291// CHECK: [B7.1] if ([B7.2]) 292// CHECK: [B6.1][B5.1]} else { 293// CHECK: [B4.1] if ([B4.2]) 294// CHECK: [B3.1][B2.1]} 295// CHECK: 4: b.operator int() 296// CHECK: 5: [B8.4] 297// CHECK: T: if [B8.5] 298// CHECK: Predecessors (1): B9 299// CHECK: Successors (2): B7 B4 300// CHECK: [ B0 (EXIT) ] 301// CHECK: Predecessors (3): B1 B3 B6 302// CHECK: Successors (0): 303// CHECK: [ B6 (ENTRY) ] 304// CHECK: Predecessors (0): 305// CHECK: Successors (1): B5 306// CHECK: [ B1 ] 307// CHECK: 1: [B2.2].~A() (Implicit destructor) 308// CHECK: 2: [B5.1].~A() (Implicit destructor) 309// CHECK: Predecessors (1): B2 310// CHECK: Successors (1): B0 311// CHECK: [ B2 ] 312// CHECK: 1: a 313// CHECK: 2: while ([B2.4]) 314// CHECK: [B4.1] 3: b.operator int() 315// CHECK: 4: [B2.3] 316// CHECK: T: while [B2.4] 317// CHECK: Predecessors (2): B3 B5 318// CHECK: Successors (2): B4 B1 319// CHECK: [ B3 ] 320// CHECK: Predecessors (1): B4 321// CHECK: Successors (1): B2 322// CHECK: [ B4 ] 323// CHECK: 1: A c; 324// CHECK: 2: [B4.1].~A() (Implicit destructor) 325// CHECK: 3: [B2.2].~A() (Implicit destructor) 326// CHECK: Predecessors (1): B2 327// CHECK: Successors (1): B3 328// CHECK: [ B5 ] 329// CHECK: 1: A a; 330// CHECK: Predecessors (1): B6 331// CHECK: Successors (1): B2 332// CHECK: [ B0 (EXIT) ] 333// CHECK: Predecessors (1): B1 334// CHECK: Successors (0): 335// CHECK: [ B12 (ENTRY) ] 336// CHECK: Predecessors (0): 337// CHECK: Successors (1): B11 338// CHECK: [ B1 ] 339// CHECK: 1: [B2.2].~A() (Implicit destructor) 340// CHECK: 2: A e; 341// CHECK: 3: [B1.2].~A() (Implicit destructor) 342// CHECK: 4: [B11.1].~A() (Implicit destructor) 343// CHECK: Predecessors (2): B9 B2 344// CHECK: Successors (1): B0 345// CHECK: [ B2 ] 346// CHECK: 1: a 347// CHECK: 2: while ([B2.4]) 348// CHECK: { 349// CHECK: [B10.1] if ([B10.2]) 350// CHECK: break; 351// CHECK: if ([B8.1]) 352// CHECK: continue; 353// CHECK: if ([B6.1]) 354// CHECK: [B5.1][B4.1] } 355// CHECK: 3: b.operator int() 356// CHECK: 4: [B2.3] 357// CHECK: T: while [B2.4] 358// CHECK: Predecessors (2): B3 B11 359// CHECK: Successors (2): B10 B1 360// CHECK: [ B3 ] 361// CHECK: Predecessors (2): B4 B7 362// CHECK: Successors (1): B2 363// CHECK: [ B4 ] 364// CHECK: 1: A d; 365// CHECK: 2: [B4.1].~A() (Implicit destructor) 366// CHECK: 3: [B10.1].~A() (Implicit destructor) 367// CHECK: 4: [B2.2].~A() (Implicit destructor) 368// CHECK: Predecessors (1): B6 369// CHECK: Successors (1): B3 370// CHECK: [ B5 ] 371// CHECK: 1: return; 372// CHECK: 2: [B10.1].~A() (Implicit destructor) 373// CHECK: 3: [B2.2].~A() (Implicit destructor) 374// CHECK: 4: [B11.1].~A() (Implicit destructor) 375// CHECK: Predecessors (1): B6 376// CHECK: Successors (1): B0 377// CHECK: [ B6 ] 378// CHECK: 1: UV 379// CHECK: T: if [B6.1] 380// CHECK: Predecessors (1): B8 381// CHECK: Successors (2): B5 B4 382// CHECK: [ B7 ] 383// CHECK: 1: [B10.1].~A() (Implicit destructor) 384// CHECK: 2: [B2.2].~A() (Implicit destructor) 385// CHECK: T: continue; 386// CHECK: Predecessors (1): B8 387// CHECK: Successors (1): B3 388// CHECK: [ B8 ] 389// CHECK: 1: UV 390// CHECK: T: if [B8.1] 391// CHECK: Predecessors (1): B10 392// CHECK: Successors (2): B7 B6 393// CHECK: [ B9 ] 394// CHECK: 1: [B10.1].~A() (Implicit destructor) 395// CHECK: T: break; 396// CHECK: Predecessors (1): B10 397// CHECK: Successors (1): B1 398// CHECK: [ B10 ] 399// CHECK: 1: A c; 400// CHECK: 2: UV 401// CHECK: T: if [B10.2] 402// CHECK: Predecessors (1): B2 403// CHECK: Successors (2): B9 B8 404// CHECK: [ B11 ] 405// CHECK: 1: A a; 406// CHECK: Predecessors (1): B12 407// CHECK: Successors (1): B2 408// CHECK: [ B0 (EXIT) ] 409// CHECK: Predecessors (2): B1 B5 410// CHECK: Successors (0): 411// CHECK: [ B4 (ENTRY) ] 412// CHECK: Predecessors (0): 413// CHECK: Successors (1): B2 414// CHECK: [ B1 ] 415// CHECK: 1: UV 416// CHECK: T: do ... while [B1.1] 417// CHECK: Predecessors (1): B2 418// CHECK: Successors (2): B3 B0 419// CHECK: [ B2 ] 420// CHECK: 1: A a; 421// CHECK: 2: [B2.1].~A() (Implicit destructor) 422// CHECK: Predecessors (2): B3 B4 423// CHECK: Successors (1): B1 424// CHECK: [ B3 ] 425// CHECK: Predecessors (1): B1 426// CHECK: Successors (1): B2 427// CHECK: [ B0 (EXIT) ] 428// CHECK: Predecessors (1): B1 429// CHECK: Successors (0): 430// CHECK: [ B12 (ENTRY) ] 431// CHECK: Predecessors (0): 432// CHECK: Successors (1): B11 433// CHECK: [ B1 ] 434// CHECK: 1: A d; 435// CHECK: 2: [B1.1].~A() (Implicit destructor) 436// CHECK: 3: [B11.1].~A() (Implicit destructor) 437// CHECK: Predecessors (2): B8 B2 438// CHECK: Successors (1): B0 439// CHECK: [ B2 ] 440// CHECK: 1: UV 441// CHECK: T: do ... while [B2.1] 442// CHECK: Predecessors (2): B3 B6 443// CHECK: Successors (2): B10 B1 444// CHECK: [ B3 ] 445// CHECK: 1: A c; 446// CHECK: 2: [B3.1].~A() (Implicit destructor) 447// CHECK: 3: [B9.1].~A() (Implicit destructor) 448// CHECK: Predecessors (1): B5 449// CHECK: Successors (1): B2 450// CHECK: [ B4 ] 451// CHECK: 1: return; 452// CHECK: 2: [B9.1].~A() (Implicit destructor) 453// CHECK: 3: [B11.1].~A() (Implicit destructor) 454// CHECK: Predecessors (1): B5 455// CHECK: Successors (1): B0 456// CHECK: [ B5 ] 457// CHECK: 1: UV 458// CHECK: T: if [B5.1] 459// CHECK: Predecessors (1): B7 460// CHECK: Successors (2): B4 B3 461// CHECK: [ B6 ] 462// CHECK: 1: [B9.1].~A() (Implicit destructor) 463// CHECK: T: continue; 464// CHECK: Predecessors (1): B7 465// CHECK: Successors (1): B2 466// CHECK: [ B7 ] 467// CHECK: 1: UV 468// CHECK: T: if [B7.1] 469// CHECK: Predecessors (1): B9 470// CHECK: Successors (2): B6 B5 471// CHECK: [ B8 ] 472// CHECK: 1: [B9.1].~A() (Implicit destructor) 473// CHECK: T: break; 474// CHECK: Predecessors (1): B9 475// CHECK: Successors (1): B1 476// CHECK: [ B9 ] 477// CHECK: 1: A b; 478// CHECK: 2: UV 479// CHECK: T: if [B9.2] 480// CHECK: Predecessors (2): B10 B11 481// CHECK: Successors (2): B8 B7 482// CHECK: [ B10 ] 483// CHECK: Predecessors (1): B2 484// CHECK: Successors (1): B9 485// CHECK: [ B11 ] 486// CHECK: 1: A a; 487// CHECK: Predecessors (1): B12 488// CHECK: Successors (1): B9 489// CHECK: [ B0 (EXIT) ] 490// CHECK: Predecessors (2): B1 B4 491// CHECK: Successors (0): 492