auto-obj-dtors-cfg-output.cpp revision fcb72ac985c26372315fabc08d43d6f66ff906b4
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 47// CHECK: [ B2 (ENTRY) ] 48// CHECK: Predecessors (0): 49// CHECK: Successors (1): B1 50// CHECK: [ B1 ] 51// CHECK: 1: A a; 52// CHECK: 2: const A &b = a; 53// CHECK: 3: const A &c = A(); 54// CHECK: 4: [B1.3].~A() (Implicit destructor) 55// CHECK: 5: [B1.1].~A() (Implicit destructor) 56// CHECK: Predecessors (1): B2 57// CHECK: Successors (1): B0 58// CHECK: [ B0 (EXIT) ] 59// CHECK: Predecessors (1): B1 60// CHECK: Successors (0): 61// CHECK: [ B2 (ENTRY) ] 62// CHECK: Predecessors (0): 63// CHECK: Successors (1): B1 64// CHECK: [ B1 ] 65// CHECK: 1: A a; 66// CHECK: 2: A c; 67// CHECK: 3: A d; 68// CHECK: 4: [B1.3].~A() (Implicit destructor) 69// CHECK: 5: [B1.2].~A() (Implicit destructor) 70// CHECK: 6: A b; 71// CHECK: 7: [B1.6].~A() (Implicit destructor) 72// CHECK: 8: [B1.1].~A() (Implicit destructor) 73// CHECK: Predecessors (1): B2 74// CHECK: Successors (1): B0 75// CHECK: [ B0 (EXIT) ] 76// CHECK: Predecessors (1): B1 77// CHECK: Successors (0): 78// CHECK: [ B4 (ENTRY) ] 79// CHECK: Predecessors (0): 80// CHECK: Successors (1): B3 81// CHECK: [ B1 ] 82// CHECK: 1: A c; 83// CHECK: 2: [B1.1].~A() (Implicit destructor) 84// CHECK: 3: [B3.2].~A() (Implicit destructor) 85// CHECK: 4: [B3.1].~A() (Implicit destructor) 86// CHECK: Predecessors (1): B3 87// CHECK: Successors (1): B0 88// CHECK: [ B2 ] 89// CHECK: 1: return; 90// CHECK: 2: [B3.2].~A() (Implicit destructor) 91// CHECK: 3: [B3.1].~A() (Implicit destructor) 92// CHECK: Predecessors (1): B3 93// CHECK: Successors (1): B0 94// CHECK: [ B3 ] 95// CHECK: 1: A a; 96// CHECK: 2: A b; 97// CHECK: 3: UV 98// CHECK: T: if [B3.3] 99// CHECK: Predecessors (1): B4 100// CHECK: Successors (2): B2 B1 101// CHECK: [ B0 (EXIT) ] 102// CHECK: Predecessors (2): B1 B2 103// CHECK: Successors (0): 104// CHECK: [ B8 (ENTRY) ] 105// CHECK: Predecessors (0): 106// CHECK: Successors (1): B7 107// CHECK: [ B1 ] 108// CHECK: l1: 109// CHECK: 1: A c; 110// CHECK: 2: [B1.1].~A() (Implicit destructor) 111// CHECK: 3: [B6.1].~A() (Implicit destructor) 112// CHECK: 4: [B7.1].~A() (Implicit destructor) 113// CHECK: Predecessors (2): B2 B3 114// CHECK: Successors (1): B0 115// CHECK: [ B2 ] 116// CHECK: 1: A b; 117// CHECK: 2: [B2.1].~A() (Implicit destructor) 118// CHECK: 3: [B6.2].~A() (Implicit destructor) 119// CHECK: Predecessors (1): B4 120// CHECK: Successors (1): B1 121// CHECK: [ B3 ] 122// CHECK: 1: [B6.2].~A() (Implicit destructor) 123// CHECK: T: goto l1; 124// CHECK: Predecessors (1): B4 125// CHECK: Successors (1): B1 126// CHECK: [ B4 ] 127// CHECK: 1: UV 128// CHECK: T: if [B4.1] 129// CHECK: Predecessors (1): B6 130// CHECK: Successors (2): B3 B2 131// CHECK: [ B5 ] 132// CHECK: 1: [B6.2].~A() (Implicit destructor) 133// CHECK: 2: [B6.1].~A() (Implicit destructor) 134// CHECK: T: goto l0; 135// CHECK: Predecessors (1): B6 136// CHECK: Successors (1): B6 137// CHECK: [ B6 ] 138// CHECK: l0: 139// CHECK: 1: A b; 140// CHECK: 2: A a; 141// CHECK: 3: UV 142// CHECK: T: if [B6.3] 143// CHECK: Predecessors (2): B7 B5 144// CHECK: Successors (2): B5 B4 145// CHECK: [ B7 ] 146// CHECK: 1: A a; 147// CHECK: Predecessors (1): B8 148// CHECK: Successors (1): B6 149// CHECK: [ B0 (EXIT) ] 150// CHECK: Predecessors (1): B1 151// CHECK: Successors (0): 152