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