blob: ce3454d00854d8e06a24d79ec52eff247561b7ef [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 Swiderskifcb72ac2010-10-01 00:23:17 +000068// 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):
Marcin Swiderski04e046c2010-10-01 00:52:17 +0000173// 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):