blob: daea5625708fc6d36e57ca7920790de5491afcad [file] [log] [blame]
Marcin Swiderskifcb72ac2010-10-01 00:23:17 +00001// 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
Marcin Swiderski04e046c2010-10-01 00:52:17 +000047void 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
Marcin Swiderski05adedc2010-10-01 01:14:17 +000068void 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
Marcin Swiderski8ae60582010-10-01 01:24:41 +0000103void 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
Marcin Swiderskifcb72ac2010-10-01 00:23:17 +0000124// 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):
Marcin Swiderski04e046c2010-10-01 00:52:17 +0000229// 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):
Marcin Swiderski05adedc2010-10-01 01:14:17 +0000324// 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):
Marcin Swiderski8ae60582010-10-01 01:24:41 +0000513// 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):