auto-obj-dtors-cfg-output.cpp revision 8ae6058cecba902c0069c24bdc9c26d475559291
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
103void test_switch_implicit_scope() {
104  A a;
105  switch (A b = a)
106    A c;
107}
108
109void test_switch_jumps() {
110  A a;
111  switch (A b = a) {
112  case 0: {
113    A c;
114    if (UV) break;
115    if (UV) return;
116    A f;
117  }
118  case 1:
119    break;
120  }
121  A g;
122}
123
124// CHECK:  [ B2 (ENTRY) ]
125// CHECK:     Predecessors (0):
126// CHECK:     Successors (1): B1
127// CHECK:  [ B1 ]
128// CHECK:       1: A a;
129// CHECK:       2: const A &b = a;
130// CHECK:       3: const A &c = A();
131// CHECK:       4: [B1.3].~A() (Implicit destructor)
132// CHECK:       5: [B1.1].~A() (Implicit destructor)
133// CHECK:     Predecessors (1): B2
134// CHECK:     Successors (1): B0
135// CHECK:  [ B0 (EXIT) ]
136// CHECK:     Predecessors (1): B1
137// CHECK:     Successors (0):
138// CHECK:  [ B2 (ENTRY) ]
139// CHECK:     Predecessors (0):
140// CHECK:     Successors (1): B1
141// CHECK:  [ B1 ]
142// CHECK:       1: A a;
143// CHECK:       2: A c;
144// CHECK:       3: A d;
145// CHECK:       4: [B1.3].~A() (Implicit destructor)
146// CHECK:       5: [B1.2].~A() (Implicit destructor)
147// CHECK:       6: A b;
148// CHECK:       7: [B1.6].~A() (Implicit destructor)
149// CHECK:       8: [B1.1].~A() (Implicit destructor)
150// CHECK:     Predecessors (1): B2
151// CHECK:     Successors (1): B0
152// CHECK:  [ B0 (EXIT) ]
153// CHECK:     Predecessors (1): B1
154// CHECK:     Successors (0):
155// CHECK:  [ B4 (ENTRY) ]
156// CHECK:     Predecessors (0):
157// CHECK:     Successors (1): B3
158// CHECK:  [ B1 ]
159// CHECK:       1: A c;
160// CHECK:       2: [B1.1].~A() (Implicit destructor)
161// CHECK:       3: [B3.2].~A() (Implicit destructor)
162// CHECK:       4: [B3.1].~A() (Implicit destructor)
163// CHECK:     Predecessors (1): B3
164// CHECK:     Successors (1): B0
165// CHECK:  [ B2 ]
166// CHECK:       1: return;
167// CHECK:       2: [B3.2].~A() (Implicit destructor)
168// CHECK:       3: [B3.1].~A() (Implicit destructor)
169// CHECK:     Predecessors (1): B3
170// CHECK:     Successors (1): B0
171// CHECK:  [ B3 ]
172// CHECK:       1: A a;
173// CHECK:       2: A b;
174// CHECK:       3: UV
175// CHECK:       T: if [B3.3]
176// CHECK:     Predecessors (1): B4
177// CHECK:     Successors (2): B2 B1
178// CHECK:  [ B0 (EXIT) ]
179// CHECK:     Predecessors (2): B1 B2
180// CHECK:     Successors (0):
181// CHECK:  [ B8 (ENTRY) ]
182// CHECK:     Predecessors (0):
183// CHECK:     Successors (1): B7
184// CHECK:  [ B1 ]
185// CHECK:     l1:
186// CHECK:       1: A c;
187// CHECK:       2: [B1.1].~A() (Implicit destructor)
188// CHECK:       3: [B6.1].~A() (Implicit destructor)
189// CHECK:       4: [B7.1].~A() (Implicit destructor)
190// CHECK:     Predecessors (2): B2 B3
191// CHECK:     Successors (1): B0
192// CHECK:  [ B2 ]
193// CHECK:       1: A b;
194// CHECK:       2: [B2.1].~A() (Implicit destructor)
195// CHECK:       3: [B6.2].~A() (Implicit destructor)
196// CHECK:     Predecessors (1): B4
197// CHECK:     Successors (1): B1
198// CHECK:  [ B3 ]
199// CHECK:       1: [B6.2].~A() (Implicit destructor)
200// CHECK:       T: goto l1;
201// CHECK:     Predecessors (1): B4
202// CHECK:     Successors (1): B1
203// CHECK:  [ B4 ]
204// CHECK:       1: UV
205// CHECK:       T: if [B4.1]
206// CHECK:     Predecessors (1): B6
207// CHECK:     Successors (2): B3 B2
208// CHECK:  [ B5 ]
209// CHECK:       1: [B6.2].~A() (Implicit destructor)
210// CHECK:       2: [B6.1].~A() (Implicit destructor)
211// CHECK:       T: goto l0;
212// CHECK:     Predecessors (1): B6
213// CHECK:     Successors (1): B6
214// CHECK:  [ B6 ]
215// CHECK:     l0:
216// CHECK:       1: A b;
217// CHECK:       2: A a;
218// CHECK:       3: UV
219// CHECK:       T: if [B6.3]
220// CHECK:     Predecessors (2): B7 B5
221// CHECK:     Successors (2): B5 B4
222// CHECK:  [ B7 ]
223// CHECK:       1: A a;
224// CHECK:     Predecessors (1): B8
225// CHECK:     Successors (1): B6
226// CHECK:  [ B0 (EXIT) ]
227// CHECK:     Predecessors (1): B1
228// CHECK:     Successors (0):
229// CHECK:  [ B5 (ENTRY) ]
230// CHECK:     Predecessors (0):
231// CHECK:     Successors (1): B4
232// CHECK:  [ B1 ]
233// CHECK:       1: [B4.3].~A() (Implicit destructor)
234// CHECK:       2: [B4.1].~A() (Implicit destructor)
235// CHECK:     Predecessors (2): B2 B3
236// CHECK:     Successors (1): B0
237// CHECK:  [ B2 ]
238// CHECK:       1: A c;
239// CHECK:       2: [B2.1].~A() (Implicit destructor)
240// CHECK:     Predecessors (1): B4
241// CHECK:     Successors (1): B1
242// CHECK:  [ B3 ]
243// CHECK:       1: A c;
244// CHECK:       2: [B3.1].~A() (Implicit destructor)
245// CHECK:     Predecessors (1): B4
246// CHECK:     Successors (1): B1
247// CHECK:  [ B4 ]
248// CHECK:       1: A a;
249// CHECK:       2: a
250// CHECK:       3: if ([B4.5])
251// CHECK: [B3.1]else
252// CHECK: [B2.1]      4: b.operator int()
253// CHECK:       5: [B4.4]
254// CHECK:       T: if [B4.5]
255// CHECK:     Predecessors (1): B5
256// CHECK:     Successors (2): B3 B2
257// CHECK:  [ B0 (EXIT) ]
258// CHECK:     Predecessors (1): B1
259// CHECK:     Successors (0):
260// CHECK:  [ B9 (ENTRY) ]
261// CHECK:     Predecessors (0):
262// CHECK:     Successors (1): B8
263// CHECK:  [ B1 ]
264// CHECK:       1: [B8.3].~A() (Implicit destructor)
265// CHECK:       2: A e;
266// CHECK:       3: [B1.2].~A() (Implicit destructor)
267// CHECK:       4: [B8.1].~A() (Implicit destructor)
268// CHECK:     Predecessors (2): B2 B5
269// CHECK:     Successors (1): B0
270// CHECK:  [ B2 ]
271// CHECK:       1: A d;
272// CHECK:       2: [B2.1].~A() (Implicit destructor)
273// CHECK:       3: [B4.1].~A() (Implicit destructor)
274// CHECK:     Predecessors (1): B4
275// CHECK:     Successors (1): B1
276// CHECK:  [ B3 ]
277// CHECK:       1: return;
278// CHECK:       2: [B4.1].~A() (Implicit destructor)
279// CHECK:       3: [B8.3].~A() (Implicit destructor)
280// CHECK:       4: [B8.1].~A() (Implicit destructor)
281// CHECK:     Predecessors (1): B4
282// CHECK:     Successors (1): B0
283// CHECK:  [ B4 ]
284// CHECK:       1: A c;
285// CHECK:       2: UV
286// CHECK:       T: if [B4.2]
287// CHECK:     Predecessors (1): B8
288// CHECK:     Successors (2): B3 B2
289// CHECK:  [ B5 ]
290// CHECK:       1: A d;
291// CHECK:       2: [B5.1].~A() (Implicit destructor)
292// CHECK:       3: [B7.1].~A() (Implicit destructor)
293// CHECK:     Predecessors (1): B7
294// CHECK:     Successors (1): B1
295// CHECK:  [ B6 ]
296// CHECK:       1: return;
297// CHECK:       2: [B7.1].~A() (Implicit destructor)
298// CHECK:       3: [B8.3].~A() (Implicit destructor)
299// CHECK:       4: [B8.1].~A() (Implicit destructor)
300// CHECK:     Predecessors (1): B7
301// CHECK:     Successors (1): B0
302// CHECK:  [ B7 ]
303// CHECK:       1: A c;
304// CHECK:       2: UV
305// CHECK:       T: if [B7.2]
306// CHECK:     Predecessors (1): B8
307// CHECK:     Successors (2): B6 B5
308// CHECK:  [ B8 ]
309// CHECK:       1: A a;
310// CHECK:       2: a
311// CHECK:       3: if ([B8.5]) {
312// CHECK: [B7.1]    if ([B7.2])
313// CHECK: [B6.1][B5.1]} else {
314// CHECK: [B4.1]    if ([B4.2])
315// CHECK: [B3.1][B2.1]}
316// CHECK:       4: b.operator int()
317// CHECK:       5: [B8.4]
318// CHECK:       T: if [B8.5]
319// CHECK:     Predecessors (1): B9
320// CHECK:     Successors (2): B7 B4
321// CHECK:  [ B0 (EXIT) ]
322// CHECK:     Predecessors (3): B1 B3 B6
323// CHECK:     Successors (0):
324// CHECK:  [ B6 (ENTRY) ]
325// CHECK:     Predecessors (0):
326// CHECK:     Successors (1): B5
327// CHECK:  [ B1 ]
328// CHECK:       1: [B2.2].~A() (Implicit destructor)
329// CHECK:       2: [B5.1].~A() (Implicit destructor)
330// CHECK:     Predecessors (1): B2
331// CHECK:     Successors (1): B0
332// CHECK:  [ B2 ]
333// CHECK:       1: a
334// CHECK:       2: while ([B2.4])
335// CHECK: [B4.1]      3: b.operator int()
336// CHECK:       4: [B2.3]
337// CHECK:       T: while [B2.4]
338// CHECK:     Predecessors (2): B3 B5
339// CHECK:     Successors (2): B4 B1
340// CHECK:  [ B3 ]
341// CHECK:     Predecessors (1): B4
342// CHECK:     Successors (1): B2
343// CHECK:  [ B4 ]
344// CHECK:       1: A c;
345// CHECK:       2: [B4.1].~A() (Implicit destructor)
346// CHECK:       3: [B2.2].~A() (Implicit destructor)
347// CHECK:     Predecessors (1): B2
348// CHECK:     Successors (1): B3
349// CHECK:  [ B5 ]
350// CHECK:       1: A a;
351// CHECK:     Predecessors (1): B6
352// CHECK:     Successors (1): B2
353// CHECK:  [ B0 (EXIT) ]
354// CHECK:     Predecessors (1): B1
355// CHECK:     Successors (0):
356// CHECK:  [ B12 (ENTRY) ]
357// CHECK:     Predecessors (0):
358// CHECK:     Successors (1): B11
359// CHECK:  [ B1 ]
360// CHECK:       1: [B2.2].~A() (Implicit destructor)
361// CHECK:       2: A e;
362// CHECK:       3: [B1.2].~A() (Implicit destructor)
363// CHECK:       4: [B11.1].~A() (Implicit destructor)
364// CHECK:     Predecessors (2): B9 B2
365// CHECK:     Successors (1): B0
366// CHECK:  [ B2 ]
367// CHECK:       1: a
368// CHECK:       2: while ([B2.4])
369// CHECK:     {
370// CHECK: [B10.1]        if ([B10.2])
371// CHECK:             break;
372// CHECK:         if ([B8.1])
373// CHECK:             continue;
374// CHECK:         if ([B6.1])
375// CHECK: [B5.1][B4.1]    }
376// CHECK:       3: b.operator int()
377// CHECK:       4: [B2.3]
378// CHECK:       T: while [B2.4]
379// CHECK:     Predecessors (2): B3 B11
380// CHECK:     Successors (2): B10 B1
381// CHECK:  [ B3 ]
382// CHECK:     Predecessors (2): B4 B7
383// CHECK:     Successors (1): B2
384// CHECK:  [ B4 ]
385// CHECK:       1: A d;
386// CHECK:       2: [B4.1].~A() (Implicit destructor)
387// CHECK:       3: [B10.1].~A() (Implicit destructor)
388// CHECK:       4: [B2.2].~A() (Implicit destructor)
389// CHECK:     Predecessors (1): B6
390// CHECK:     Successors (1): B3
391// CHECK:  [ B5 ]
392// CHECK:       1: return;
393// CHECK:       2: [B10.1].~A() (Implicit destructor)
394// CHECK:       3: [B2.2].~A() (Implicit destructor)
395// CHECK:       4: [B11.1].~A() (Implicit destructor)
396// CHECK:     Predecessors (1): B6
397// CHECK:     Successors (1): B0
398// CHECK:  [ B6 ]
399// CHECK:       1: UV
400// CHECK:       T: if [B6.1]
401// CHECK:     Predecessors (1): B8
402// CHECK:     Successors (2): B5 B4
403// CHECK:  [ B7 ]
404// CHECK:       1: [B10.1].~A() (Implicit destructor)
405// CHECK:       2: [B2.2].~A() (Implicit destructor)
406// CHECK:       T: continue;
407// CHECK:     Predecessors (1): B8
408// CHECK:     Successors (1): B3
409// CHECK:  [ B8 ]
410// CHECK:       1: UV
411// CHECK:       T: if [B8.1]
412// CHECK:     Predecessors (1): B10
413// CHECK:     Successors (2): B7 B6
414// CHECK:  [ B9 ]
415// CHECK:       1: [B10.1].~A() (Implicit destructor)
416// CHECK:       T: break;
417// CHECK:     Predecessors (1): B10
418// CHECK:     Successors (1): B1
419// CHECK:  [ B10 ]
420// CHECK:       1: A c;
421// CHECK:       2: UV
422// CHECK:       T: if [B10.2]
423// CHECK:     Predecessors (1): B2
424// CHECK:     Successors (2): B9 B8
425// CHECK:  [ B11 ]
426// CHECK:       1: A a;
427// CHECK:     Predecessors (1): B12
428// CHECK:     Successors (1): B2
429// CHECK:  [ B0 (EXIT) ]
430// CHECK:     Predecessors (2): B1 B5
431// CHECK:     Successors (0):
432// CHECK:  [ B4 (ENTRY) ]
433// CHECK:     Predecessors (0):
434// CHECK:     Successors (1): B2
435// CHECK:  [ B1 ]
436// CHECK:       1: UV
437// CHECK:       T: do ... while [B1.1]
438// CHECK:     Predecessors (1): B2
439// CHECK:     Successors (2): B3 B0
440// CHECK:  [ B2 ]
441// CHECK:       1: A a;
442// CHECK:       2: [B2.1].~A() (Implicit destructor)
443// CHECK:     Predecessors (2): B3 B4
444// CHECK:     Successors (1): B1
445// CHECK:  [ B3 ]
446// CHECK:     Predecessors (1): B1
447// CHECK:     Successors (1): B2
448// CHECK:  [ B0 (EXIT) ]
449// CHECK:     Predecessors (1): B1
450// CHECK:     Successors (0):
451// CHECK:  [ B12 (ENTRY) ]
452// CHECK:     Predecessors (0):
453// CHECK:     Successors (1): B11
454// CHECK:  [ B1 ]
455// CHECK:       1: A d;
456// CHECK:       2: [B1.1].~A() (Implicit destructor)
457// CHECK:       3: [B11.1].~A() (Implicit destructor)
458// CHECK:     Predecessors (2): B8 B2
459// CHECK:     Successors (1): B0
460// CHECK:  [ B2 ]
461// CHECK:       1: UV
462// CHECK:       T: do ... while [B2.1]
463// CHECK:     Predecessors (2): B3 B6
464// CHECK:     Successors (2): B10 B1
465// CHECK:  [ B3 ]
466// CHECK:       1: A c;
467// CHECK:       2: [B3.1].~A() (Implicit destructor)
468// CHECK:       3: [B9.1].~A() (Implicit destructor)
469// CHECK:     Predecessors (1): B5
470// CHECK:     Successors (1): B2
471// CHECK:  [ B4 ]
472// CHECK:       1: return;
473// CHECK:       2: [B9.1].~A() (Implicit destructor)
474// CHECK:       3: [B11.1].~A() (Implicit destructor)
475// CHECK:     Predecessors (1): B5
476// CHECK:     Successors (1): B0
477// CHECK:  [ B5 ]
478// CHECK:       1: UV
479// CHECK:       T: if [B5.1]
480// CHECK:     Predecessors (1): B7
481// CHECK:     Successors (2): B4 B3
482// CHECK:  [ B6 ]
483// CHECK:       1: [B9.1].~A() (Implicit destructor)
484// CHECK:       T: continue;
485// CHECK:     Predecessors (1): B7
486// CHECK:     Successors (1): B2
487// CHECK:  [ B7 ]
488// CHECK:       1: UV
489// CHECK:       T: if [B7.1]
490// CHECK:     Predecessors (1): B9
491// CHECK:     Successors (2): B6 B5
492// CHECK:  [ B8 ]
493// CHECK:       1: [B9.1].~A() (Implicit destructor)
494// CHECK:       T: break;
495// CHECK:     Predecessors (1): B9
496// CHECK:     Successors (1): B1
497// CHECK:  [ B9 ]
498// CHECK:       1: A b;
499// CHECK:       2: UV
500// CHECK:       T: if [B9.2]
501// CHECK:     Predecessors (2): B10 B11
502// CHECK:     Successors (2): B8 B7
503// CHECK:  [ B10 ]
504// CHECK:     Predecessors (1): B2
505// CHECK:     Successors (1): B9
506// CHECK:  [ B11 ]
507// CHECK:       1: A a;
508// CHECK:     Predecessors (1): B12
509// CHECK:     Successors (1): B9
510// CHECK:  [ B0 (EXIT) ]
511// CHECK:     Predecessors (2): B1 B4
512// CHECK:     Successors (0):
513// CHECK:  [ B4 (ENTRY) ]
514// CHECK:     Predecessors (0):
515// CHECK:     Successors (1): B2
516// CHECK:  [ B1 ]
517// CHECK:       1: [B2.3].~A() (Implicit destructor)
518// CHECK:       2: [B2.1].~A() (Implicit destructor)
519// CHECK:     Predecessors (2): B3 B2
520// CHECK:     Successors (1): B0
521// CHECK:  [ B2 ]
522// CHECK:       1: A a;
523// CHECK:       2: a
524// CHECK:       3: switch ([B2.4])
525// CHECK: [B3.1]      4: b.operator int()
526// CHECK:       T: switch [B2.4]
527// CHECK:     Predecessors (1): B4
528// CHECK:     Successors (1): B1
529// CHECK:  [ B3 ]
530// CHECK:       1: A c;
531// CHECK:       2: [B3.1].~A() (Implicit destructor)
532// CHECK:     Predecessors (0):
533// CHECK:     Successors (1): B1
534// CHECK:  [ B0 (EXIT) ]
535// CHECK:     Predecessors (1): B1
536// CHECK:     Successors (0):
537// CHECK:  [ B9 (ENTRY) ]
538// CHECK:     Predecessors (0):
539// CHECK:     Successors (1): B2
540// CHECK:  [ B1 ]
541// CHECK:       1: [B2.3].~A() (Implicit destructor)
542// CHECK:       2: A g;
543// CHECK:       3: [B1.2].~A() (Implicit destructor)
544// CHECK:       4: [B2.1].~A() (Implicit destructor)
545// CHECK:     Predecessors (3): B3 B7 B2
546// CHECK:     Successors (1): B0
547// CHECK:  [ B2 ]
548// CHECK:       1: A a;
549// CHECK:       2: a
550// CHECK:       3: switch ([B2.4]) {
551// CHECK:   case 0:
552// CHECK:     {
553// CHECK: [B8.1]        if ([B8.2])
554// CHECK:             break;
555// CHECK:         if ([B6.1])
556// CHECK: [B5.1][B4.1]    }
557// CHECK:   case 1:
558// CHECK:     break;
559// CHECK: }
560// CHECK:       4: b.operator int()
561// CHECK:       T: switch [B2.4]
562// CHECK:     Predecessors (1): B9
563// CHECK:     Successors (3): B3 B8
564// CHECK:      B1
565// CHECK:  [ B3 ]
566// CHECK:     case 1:
567// CHECK:       T: break;
568// CHECK:     Predecessors (2): B2 B4
569// CHECK:     Successors (1): B1
570// CHECK:  [ B4 ]
571// CHECK:       1: A f;
572// CHECK:       2: [B4.1].~A() (Implicit destructor)
573// CHECK:       3: [B8.1].~A() (Implicit destructor)
574// CHECK:     Predecessors (1): B6
575// CHECK:     Successors (1): B3
576// CHECK:  [ B5 ]
577// CHECK:       1: return;
578// CHECK:       2: [B8.1].~A() (Implicit destructor)
579// CHECK:       3: [B2.3].~A() (Implicit destructor)
580// CHECK:       4: [B2.1].~A() (Implicit destructor)
581// CHECK:     Predecessors (1): B6
582// CHECK:     Successors (1): B0
583// CHECK:  [ B6 ]
584// CHECK:       1: UV
585// CHECK:       T: if [B6.1]
586// CHECK:     Predecessors (1): B8
587// CHECK:     Successors (2): B5 B4
588// CHECK:  [ B7 ]
589// CHECK:       1: [B8.1].~A() (Implicit destructor)
590// CHECK:       T: break;
591// CHECK:     Predecessors (1): B8
592// CHECK:     Successors (1): B1
593// CHECK:  [ B8 ]
594// CHECK:     case 0:
595// CHECK:       1: A c;
596// CHECK:       2: UV
597// CHECK:       T: if [B8.2]
598// CHECK:     Predecessors (1): B2
599// CHECK:     Successors (2): B7 B6
600// CHECK:  [ B0 (EXIT) ]
601// CHECK:     Predecessors (2): B1 B5
602// CHECK:     Successors (0):
603