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