auto-obj-dtors-cfg-output.cpp revision 04e046cbf7153fc261d730d460f081322d5c42f6
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 68// CHECK: [ B2 (ENTRY) ] 69// CHECK: Predecessors (0): 70// CHECK: Successors (1): B1 71// CHECK: [ B1 ] 72// CHECK: 1: A a; 73// CHECK: 2: const A &b = a; 74// CHECK: 3: const A &c = A(); 75// CHECK: 4: [B1.3].~A() (Implicit destructor) 76// CHECK: 5: [B1.1].~A() (Implicit destructor) 77// CHECK: Predecessors (1): B2 78// CHECK: Successors (1): B0 79// CHECK: [ B0 (EXIT) ] 80// CHECK: Predecessors (1): B1 81// CHECK: Successors (0): 82// CHECK: [ B2 (ENTRY) ] 83// CHECK: Predecessors (0): 84// CHECK: Successors (1): B1 85// CHECK: [ B1 ] 86// CHECK: 1: A a; 87// CHECK: 2: A c; 88// CHECK: 3: A d; 89// CHECK: 4: [B1.3].~A() (Implicit destructor) 90// CHECK: 5: [B1.2].~A() (Implicit destructor) 91// CHECK: 6: A b; 92// CHECK: 7: [B1.6].~A() (Implicit destructor) 93// CHECK: 8: [B1.1].~A() (Implicit destructor) 94// CHECK: Predecessors (1): B2 95// CHECK: Successors (1): B0 96// CHECK: [ B0 (EXIT) ] 97// CHECK: Predecessors (1): B1 98// CHECK: Successors (0): 99// CHECK: [ B4 (ENTRY) ] 100// CHECK: Predecessors (0): 101// CHECK: Successors (1): B3 102// CHECK: [ B1 ] 103// CHECK: 1: A c; 104// CHECK: 2: [B1.1].~A() (Implicit destructor) 105// CHECK: 3: [B3.2].~A() (Implicit destructor) 106// CHECK: 4: [B3.1].~A() (Implicit destructor) 107// CHECK: Predecessors (1): B3 108// CHECK: Successors (1): B0 109// CHECK: [ B2 ] 110// CHECK: 1: return; 111// CHECK: 2: [B3.2].~A() (Implicit destructor) 112// CHECK: 3: [B3.1].~A() (Implicit destructor) 113// CHECK: Predecessors (1): B3 114// CHECK: Successors (1): B0 115// CHECK: [ B3 ] 116// CHECK: 1: A a; 117// CHECK: 2: A b; 118// CHECK: 3: UV 119// CHECK: T: if [B3.3] 120// CHECK: Predecessors (1): B4 121// CHECK: Successors (2): B2 B1 122// CHECK: [ B0 (EXIT) ] 123// CHECK: Predecessors (2): B1 B2 124// CHECK: Successors (0): 125// CHECK: [ B8 (ENTRY) ] 126// CHECK: Predecessors (0): 127// CHECK: Successors (1): B7 128// CHECK: [ B1 ] 129// CHECK: l1: 130// CHECK: 1: A c; 131// CHECK: 2: [B1.1].~A() (Implicit destructor) 132// CHECK: 3: [B6.1].~A() (Implicit destructor) 133// CHECK: 4: [B7.1].~A() (Implicit destructor) 134// CHECK: Predecessors (2): B2 B3 135// CHECK: Successors (1): B0 136// CHECK: [ B2 ] 137// CHECK: 1: A b; 138// CHECK: 2: [B2.1].~A() (Implicit destructor) 139// CHECK: 3: [B6.2].~A() (Implicit destructor) 140// CHECK: Predecessors (1): B4 141// CHECK: Successors (1): B1 142// CHECK: [ B3 ] 143// CHECK: 1: [B6.2].~A() (Implicit destructor) 144// CHECK: T: goto l1; 145// CHECK: Predecessors (1): B4 146// CHECK: Successors (1): B1 147// CHECK: [ B4 ] 148// CHECK: 1: UV 149// CHECK: T: if [B4.1] 150// CHECK: Predecessors (1): B6 151// CHECK: Successors (2): B3 B2 152// CHECK: [ B5 ] 153// CHECK: 1: [B6.2].~A() (Implicit destructor) 154// CHECK: 2: [B6.1].~A() (Implicit destructor) 155// CHECK: T: goto l0; 156// CHECK: Predecessors (1): B6 157// CHECK: Successors (1): B6 158// CHECK: [ B6 ] 159// CHECK: l0: 160// CHECK: 1: A b; 161// CHECK: 2: A a; 162// CHECK: 3: UV 163// CHECK: T: if [B6.3] 164// CHECK: Predecessors (2): B7 B5 165// CHECK: Successors (2): B5 B4 166// CHECK: [ B7 ] 167// CHECK: 1: A a; 168// CHECK: Predecessors (1): B8 169// CHECK: Successors (1): B6 170// CHECK: [ B0 (EXIT) ] 171// CHECK: Predecessors (1): B1 172// CHECK: Successors (0): 173// CHECK: [ B5 (ENTRY) ] 174// CHECK: Predecessors (0): 175// CHECK: Successors (1): B4 176// CHECK: [ B1 ] 177// CHECK: 1: [B4.3].~A() (Implicit destructor) 178// CHECK: 2: [B4.1].~A() (Implicit destructor) 179// CHECK: Predecessors (2): B2 B3 180// CHECK: Successors (1): B0 181// CHECK: [ B2 ] 182// CHECK: 1: A c; 183// CHECK: 2: [B2.1].~A() (Implicit destructor) 184// CHECK: Predecessors (1): B4 185// CHECK: Successors (1): B1 186// CHECK: [ B3 ] 187// CHECK: 1: A c; 188// CHECK: 2: [B3.1].~A() (Implicit destructor) 189// CHECK: Predecessors (1): B4 190// CHECK: Successors (1): B1 191// CHECK: [ B4 ] 192// CHECK: 1: A a; 193// CHECK: 2: a 194// CHECK: 3: if ([B4.5]) 195// CHECK: [B3.1]else 196// CHECK: [B2.1] 4: b.operator int() 197// CHECK: 5: [B4.4] 198// CHECK: T: if [B4.5] 199// CHECK: Predecessors (1): B5 200// CHECK: Successors (2): B3 B2 201// CHECK: [ B0 (EXIT) ] 202// CHECK: Predecessors (1): B1 203// CHECK: Successors (0): 204// CHECK: [ B9 (ENTRY) ] 205// CHECK: Predecessors (0): 206// CHECK: Successors (1): B8 207// CHECK: [ B1 ] 208// CHECK: 1: [B8.3].~A() (Implicit destructor) 209// CHECK: 2: A e; 210// CHECK: 3: [B1.2].~A() (Implicit destructor) 211// CHECK: 4: [B8.1].~A() (Implicit destructor) 212// CHECK: Predecessors (2): B2 B5 213// CHECK: Successors (1): B0 214// CHECK: [ B2 ] 215// CHECK: 1: A d; 216// CHECK: 2: [B2.1].~A() (Implicit destructor) 217// CHECK: 3: [B4.1].~A() (Implicit destructor) 218// CHECK: Predecessors (1): B4 219// CHECK: Successors (1): B1 220// CHECK: [ B3 ] 221// CHECK: 1: return; 222// CHECK: 2: [B4.1].~A() (Implicit destructor) 223// CHECK: 3: [B8.3].~A() (Implicit destructor) 224// CHECK: 4: [B8.1].~A() (Implicit destructor) 225// CHECK: Predecessors (1): B4 226// CHECK: Successors (1): B0 227// CHECK: [ B4 ] 228// CHECK: 1: A c; 229// CHECK: 2: UV 230// CHECK: T: if [B4.2] 231// CHECK: Predecessors (1): B8 232// CHECK: Successors (2): B3 B2 233// CHECK: [ B5 ] 234// CHECK: 1: A d; 235// CHECK: 2: [B5.1].~A() (Implicit destructor) 236// CHECK: 3: [B7.1].~A() (Implicit destructor) 237// CHECK: Predecessors (1): B7 238// CHECK: Successors (1): B1 239// CHECK: [ B6 ] 240// CHECK: 1: return; 241// CHECK: 2: [B7.1].~A() (Implicit destructor) 242// CHECK: 3: [B8.3].~A() (Implicit destructor) 243// CHECK: 4: [B8.1].~A() (Implicit destructor) 244// CHECK: Predecessors (1): B7 245// CHECK: Successors (1): B0 246// CHECK: [ B7 ] 247// CHECK: 1: A c; 248// CHECK: 2: UV 249// CHECK: T: if [B7.2] 250// CHECK: Predecessors (1): B8 251// CHECK: Successors (2): B6 B5 252// CHECK: [ B8 ] 253// CHECK: 1: A a; 254// CHECK: 2: a 255// CHECK: 3: if ([B8.5]) { 256// CHECK: [B7.1] if ([B7.2]) 257// CHECK: [B6.1][B5.1]} else { 258// CHECK: [B4.1] if ([B4.2]) 259// CHECK: [B3.1][B2.1]} 260// CHECK: 4: b.operator int() 261// CHECK: 5: [B8.4] 262// CHECK: T: if [B8.5] 263// CHECK: Predecessors (1): B9 264// CHECK: Successors (2): B7 B4 265// CHECK: [ B0 (EXIT) ] 266// CHECK: Predecessors (3): B1 B3 B6 267// CHECK: Successors (0): 268