xref: /aosp_15_r20/external/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG %s > %t 2>&1
2*67e74705SXin Li // RUN: FileCheck --input-file=%t %s
3*67e74705SXin Li 
4*67e74705SXin Li class A {
5*67e74705SXin Li public:
6*67e74705SXin Li // CHECK:      [B1 (ENTRY)]
7*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
8*67e74705SXin Li // CHECK:      [B0 (EXIT)]
9*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
A()10*67e74705SXin Li   A() {}
11*67e74705SXin Li 
12*67e74705SXin Li // CHECK:      [B1 (ENTRY)]
13*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
14*67e74705SXin Li // CHECK:      [B0 (EXIT)]
15*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
~A()16*67e74705SXin Li   ~A() {}
17*67e74705SXin Li 
18*67e74705SXin Li // CHECK:      [B2 (ENTRY)]
19*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
20*67e74705SXin Li // CHECK:      [B1]
21*67e74705SXin Li // CHECK-NEXT:   1: 1
22*67e74705SXin Li // CHECK-NEXT:   2: return [B1.1];
23*67e74705SXin Li // CHECK-NEXT:   Preds (1): B2
24*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
25*67e74705SXin Li // CHECK:      [B0 (EXIT)]
26*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
operator int() const27*67e74705SXin Li   operator int() const { return 1; }
28*67e74705SXin Li };
29*67e74705SXin Li 
30*67e74705SXin Li extern const bool UV;
31*67e74705SXin Li 
32*67e74705SXin Li // CHECK:      [B2 (ENTRY)]
33*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
34*67e74705SXin Li // CHECK:      [B1]
35*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
36*67e74705SXin Li // CHECK-NEXT:   2: A a;
37*67e74705SXin Li // CHECK-NEXT:   3: a
38*67e74705SXin Li // CHECK-NEXT:   4: [B1.3] (ImplicitCastExpr, NoOp, const class A)
39*67e74705SXin Li // CHECK-NEXT:   5: const A &b = a;
40*67e74705SXin Li // CHECK-NEXT:   6: A() (CXXConstructExpr, class A)
41*67e74705SXin Li // CHECK-NEXT:   7: [B1.6] (BindTemporary)
42*67e74705SXin Li // CHECK-NEXT:   8: [B1.7] (ImplicitCastExpr, NoOp, const class A)
43*67e74705SXin Li // CHECK-NEXT:   9: [B1.8]
44*67e74705SXin Li // CHECK:       10: const A &c = A();
45*67e74705SXin Li // CHECK:       11: [B1.10].~A() (Implicit destructor)
46*67e74705SXin Li // CHECK:       12: [B1.2].~A() (Implicit destructor)
47*67e74705SXin Li // CHECK-NEXT:   Preds (1): B2
48*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
49*67e74705SXin Li // CHECK:      [B0 (EXIT)]
50*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_const_ref()51*67e74705SXin Li void test_const_ref() {
52*67e74705SXin Li   A a;
53*67e74705SXin Li   const A& b = a;
54*67e74705SXin Li   const A& c = A();
55*67e74705SXin Li }
56*67e74705SXin Li 
57*67e74705SXin Li // CHECK:      [B2 (ENTRY)]
58*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
59*67e74705SXin Li // CHECK:      [B1]
60*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A [2])
61*67e74705SXin Li // CHECK-NEXT:   2: A a[2];
62*67e74705SXin Li // CHECK-NEXT:   3:  (CXXConstructExpr, class A [0])
63*67e74705SXin Li // CHECK-NEXT:   4: A b[0];
64*67e74705SXin Li // CHECK-NEXT:   5: [B1.2].~A() (Implicit destructor)
65*67e74705SXin Li // CHECK-NEXT:   Preds (1): B2
66*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
67*67e74705SXin Li // CHECK:      [B0 (EXIT)]
68*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_array()69*67e74705SXin Li void test_array() {
70*67e74705SXin Li   A a[2];
71*67e74705SXin Li   A b[0];
72*67e74705SXin Li }
73*67e74705SXin Li 
74*67e74705SXin Li // CHECK:      [B2 (ENTRY)]
75*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
76*67e74705SXin Li // CHECK:      [B1]
77*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
78*67e74705SXin Li // CHECK-NEXT:   2: A a;
79*67e74705SXin Li // CHECK-NEXT:   3:  (CXXConstructExpr, class A)
80*67e74705SXin Li // CHECK-NEXT:   4: A c;
81*67e74705SXin Li // CHECK-NEXT:   5:  (CXXConstructExpr, class A)
82*67e74705SXin Li // CHECK-NEXT:   6: A d;
83*67e74705SXin Li // CHECK-NEXT:   7: [B1.6].~A() (Implicit destructor)
84*67e74705SXin Li // CHECK-NEXT:   8: [B1.4].~A() (Implicit destructor)
85*67e74705SXin Li // CHECK-NEXT:   9:  (CXXConstructExpr, class A)
86*67e74705SXin Li // CHECK:       10: A b;
87*67e74705SXin Li // CHECK:       11: [B1.10].~A() (Implicit destructor)
88*67e74705SXin Li // CHECK:       12: [B1.2].~A() (Implicit destructor)
89*67e74705SXin Li // CHECK-NEXT:   Preds (1): B2
90*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
91*67e74705SXin Li // CHECK:      [B0 (EXIT)]
92*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_scope()93*67e74705SXin Li void test_scope() {
94*67e74705SXin Li   A a;
95*67e74705SXin Li   { A c;
96*67e74705SXin Li     A d;
97*67e74705SXin Li   }
98*67e74705SXin Li   A b;
99*67e74705SXin Li }
100*67e74705SXin Li 
101*67e74705SXin Li // CHECK:      [B4 (ENTRY)]
102*67e74705SXin Li // CHECK-NEXT:   Succs (1): B3
103*67e74705SXin Li // CHECK:      [B1]
104*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
105*67e74705SXin Li // CHECK-NEXT:   2: A c;
106*67e74705SXin Li // CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)
107*67e74705SXin Li // CHECK-NEXT:   4: [B3.4].~A() (Implicit destructor)
108*67e74705SXin Li // CHECK-NEXT:   5: [B3.2].~A() (Implicit destructor)
109*67e74705SXin Li // CHECK-NEXT:   Preds (1): B3
110*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
111*67e74705SXin Li // CHECK:      [B2]
112*67e74705SXin Li // CHECK-NEXT:   1: return;
113*67e74705SXin Li // CHECK-NEXT:   2: [B3.4].~A() (Implicit destructor)
114*67e74705SXin Li // CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
115*67e74705SXin Li // CHECK-NEXT:   Preds (1): B3
116*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
117*67e74705SXin Li // CHECK:      [B3]
118*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
119*67e74705SXin Li // CHECK-NEXT:   2: A a;
120*67e74705SXin Li // CHECK-NEXT:   3:  (CXXConstructExpr, class A)
121*67e74705SXin Li // CHECK-NEXT:   4: A b;
122*67e74705SXin Li // CHECK-NEXT:   5: UV
123*67e74705SXin Li // CHECK-NEXT:   6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool)
124*67e74705SXin Li // CHECK-NEXT:   T: if [B3.6]
125*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
126*67e74705SXin Li // CHECK-NEXT:   Succs (2): B2 B1
127*67e74705SXin Li // CHECK:      [B0 (EXIT)]
128*67e74705SXin Li // CHECK-NEXT:   Preds (2): B1 B2
test_return()129*67e74705SXin Li void test_return() {
130*67e74705SXin Li   A a;
131*67e74705SXin Li   A b;
132*67e74705SXin Li   if (UV) return;
133*67e74705SXin Li   A c;
134*67e74705SXin Li }
135*67e74705SXin Li 
136*67e74705SXin Li // CHECK:      [B8 (ENTRY)]
137*67e74705SXin Li // CHECK-NEXT:   Succs (1): B7
138*67e74705SXin Li // CHECK:      [B1]
139*67e74705SXin Li // CHECK:       l1:
140*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
141*67e74705SXin Li // CHECK-NEXT:   2: A c;
142*67e74705SXin Li // CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)
143*67e74705SXin Li // CHECK-NEXT:   4: [B6.2].~A() (Implicit destructor)
144*67e74705SXin Li // CHECK-NEXT:   5: [B7.2].~A() (Implicit destructor)
145*67e74705SXin Li // CHECK-NEXT:   Preds (2): B2 B3
146*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
147*67e74705SXin Li // CHECK:      [B2]
148*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
149*67e74705SXin Li // CHECK-NEXT:   2: A b;
150*67e74705SXin Li // CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)
151*67e74705SXin Li // CHECK-NEXT:   4: [B6.4].~A() (Implicit destructor)
152*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
153*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
154*67e74705SXin Li // CHECK:      [B3]
155*67e74705SXin Li // CHECK-NEXT:   1: [B6.4].~A() (Implicit destructor)
156*67e74705SXin Li // CHECK-NEXT:   T: goto l1;
157*67e74705SXin Li // CHECK:        Preds (1): B4
158*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
159*67e74705SXin Li // CHECK:      [B4]
160*67e74705SXin Li // CHECK-NEXT:   1: UV
161*67e74705SXin Li // CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)
162*67e74705SXin Li // CHECK-NEXT:   T: if [B4.2]
163*67e74705SXin Li // CHECK-NEXT:   Preds (1): B6
164*67e74705SXin Li // CHECK-NEXT:   Succs (2): B3 B2
165*67e74705SXin Li // CHECK:      [B5]
166*67e74705SXin Li // CHECK-NEXT:   1: [B6.4].~A() (Implicit destructor)
167*67e74705SXin Li // CHECK-NEXT:   2: [B6.2].~A() (Implicit destructor)
168*67e74705SXin Li // CHECK-NEXT:   T: goto l0;
169*67e74705SXin Li // CHECK:        Preds (1): B6
170*67e74705SXin Li // CHECK-NEXT:   Succs (1): B6
171*67e74705SXin Li // CHECK:      [B6]
172*67e74705SXin Li // CHECK:       l0:
173*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
174*67e74705SXin Li // CHECK-NEXT:   2: A b;
175*67e74705SXin Li // CHECK-NEXT:   3:  (CXXConstructExpr, class A)
176*67e74705SXin Li // CHECK-NEXT:   4: A a;
177*67e74705SXin Li // CHECK-NEXT:   5: UV
178*67e74705SXin Li // CHECK-NEXT:   6: [B6.5] (ImplicitCastExpr, LValueToRValue, _Bool)
179*67e74705SXin Li // CHECK-NEXT:   T: if [B6.6]
180*67e74705SXin Li // CHECK-NEXT:   Preds (2): B7 B5
181*67e74705SXin Li // CHECK-NEXT:   Succs (2): B5 B4
182*67e74705SXin Li // CHECK:      [B7]
183*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
184*67e74705SXin Li // CHECK-NEXT:   2: A a;
185*67e74705SXin Li // CHECK-NEXT:   Preds (1): B8
186*67e74705SXin Li // CHECK-NEXT:   Succs (1): B6
187*67e74705SXin Li // CHECK:      [B0 (EXIT)]
188*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_goto()189*67e74705SXin Li void test_goto() {
190*67e74705SXin Li   A a;
191*67e74705SXin Li l0:
192*67e74705SXin Li   A b;
193*67e74705SXin Li   { A a;
194*67e74705SXin Li     if (UV) goto l0;
195*67e74705SXin Li     if (UV) goto l1;
196*67e74705SXin Li     A b;
197*67e74705SXin Li   }
198*67e74705SXin Li l1:
199*67e74705SXin Li   A c;
200*67e74705SXin Li }
201*67e74705SXin Li 
202*67e74705SXin Li // CHECK:      [B5 (ENTRY)]
203*67e74705SXin Li // CHECK-NEXT:   Succs (1): B4
204*67e74705SXin Li // CHECK:      [B1]
205*67e74705SXin Li // CHECK-NEXT:   1: [B4.6].~A() (Implicit destructor)
206*67e74705SXin Li // CHECK-NEXT:   2: [B4.2].~A() (Implicit destructor)
207*67e74705SXin Li // CHECK-NEXT:   Preds (2): B2 B3
208*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
209*67e74705SXin Li // CHECK:      [B2]
210*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
211*67e74705SXin Li // CHECK-NEXT:   2: A c;
212*67e74705SXin Li // CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)
213*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
214*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
215*67e74705SXin Li // CHECK:      [B3]
216*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
217*67e74705SXin Li // CHECK-NEXT:   2: A c;
218*67e74705SXin Li // CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
219*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
220*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
221*67e74705SXin Li // CHECK:      [B4]
222*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
223*67e74705SXin Li // CHECK-NEXT:   2: A a;
224*67e74705SXin Li // CHECK-NEXT:   3: a
225*67e74705SXin Li // CHECK-NEXT:   4: [B4.3] (ImplicitCastExpr, NoOp, const class A)
226*67e74705SXin Li // CHECK-NEXT:   5: [B4.4] (CXXConstructExpr, class A)
227*67e74705SXin Li // CHECK-NEXT:   6: A b = a;
228*67e74705SXin Li // CHECK-NEXT:   7: b
229*67e74705SXin Li // CHECK-NEXT:   8: [B4.7] (ImplicitCastExpr, NoOp, const class A)
230*67e74705SXin Li // CHECK-NEXT:   9: [B4.8].operator int
231*67e74705SXin Li // CHECK:       10: [B4.8]
232*67e74705SXin Li // CHECK:       11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int)
233*67e74705SXin Li // CHECK:       12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
234*67e74705SXin Li // CHECK-NEXT:   T: if [B4.12]
235*67e74705SXin Li // CHECK-NEXT:   Preds (1): B5
236*67e74705SXin Li // CHECK-NEXT:   Succs (2): B3 B2
237*67e74705SXin Li // CHECK:      [B0 (EXIT)]
238*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_if_implicit_scope()239*67e74705SXin Li void test_if_implicit_scope() {
240*67e74705SXin Li   A a;
241*67e74705SXin Li   if (A b = a)
242*67e74705SXin Li     A c;
243*67e74705SXin Li   else A c;
244*67e74705SXin Li }
245*67e74705SXin Li 
246*67e74705SXin Li // CHECK:      [B9 (ENTRY)]
247*67e74705SXin Li // CHECK-NEXT:   Succs (1): B8
248*67e74705SXin Li // CHECK:      [B1]
249*67e74705SXin Li // CHECK-NEXT:   1: [B8.6].~A() (Implicit destructor)
250*67e74705SXin Li // CHECK-NEXT:   2:  (CXXConstructExpr, class A)
251*67e74705SXin Li // CHECK-NEXT:   3: A e;
252*67e74705SXin Li // CHECK-NEXT:   4: [B1.3].~A() (Implicit destructor)
253*67e74705SXin Li // CHECK-NEXT:   5: [B8.2].~A() (Implicit destructor)
254*67e74705SXin Li // CHECK-NEXT:   Preds (2): B2 B5
255*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
256*67e74705SXin Li // CHECK:      [B2]
257*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
258*67e74705SXin Li // CHECK-NEXT:   2: A d;
259*67e74705SXin Li // CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)
260*67e74705SXin Li // CHECK-NEXT:   4: [B4.2].~A() (Implicit destructor)
261*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
262*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
263*67e74705SXin Li // CHECK:      [B3]
264*67e74705SXin Li // CHECK-NEXT:   1: return;
265*67e74705SXin Li // CHECK-NEXT:   2: [B4.2].~A() (Implicit destructor)
266*67e74705SXin Li // CHECK-NEXT:   3: [B8.6].~A() (Implicit destructor)
267*67e74705SXin Li // CHECK-NEXT:   4: [B8.2].~A() (Implicit destructor)
268*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
269*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
270*67e74705SXin Li // CHECK:      [B4]
271*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
272*67e74705SXin Li // CHECK-NEXT:   2: A c;
273*67e74705SXin Li // CHECK-NEXT:   3: UV
274*67e74705SXin Li // CHECK-NEXT:   4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool)
275*67e74705SXin Li // CHECK-NEXT:   T: if [B4.4]
276*67e74705SXin Li // CHECK-NEXT:   Preds (1): B8
277*67e74705SXin Li // CHECK-NEXT:   Succs (2): B3 B2
278*67e74705SXin Li // CHECK:      [B5]
279*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
280*67e74705SXin Li // CHECK-NEXT:   2: A d;
281*67e74705SXin Li // CHECK-NEXT:   3: [B5.2].~A() (Implicit destructor)
282*67e74705SXin Li // CHECK-NEXT:   4: [B7.2].~A() (Implicit destructor)
283*67e74705SXin Li // CHECK-NEXT:   Preds (1): B7
284*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
285*67e74705SXin Li // CHECK:      [B6]
286*67e74705SXin Li // CHECK-NEXT:   1: return;
287*67e74705SXin Li // CHECK-NEXT:   2: [B7.2].~A() (Implicit destructor)
288*67e74705SXin Li // CHECK-NEXT:   3: [B8.6].~A() (Implicit destructor)
289*67e74705SXin Li // CHECK-NEXT:   4: [B8.2].~A() (Implicit destructor)
290*67e74705SXin Li // CHECK-NEXT:   Preds (1): B7
291*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
292*67e74705SXin Li // CHECK:      [B7]
293*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
294*67e74705SXin Li // CHECK-NEXT:   2: A c;
295*67e74705SXin Li // CHECK-NEXT:   3: UV
296*67e74705SXin Li // CHECK-NEXT:   4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool)
297*67e74705SXin Li // CHECK-NEXT:   T: if [B7.4]
298*67e74705SXin Li // CHECK-NEXT:   Preds (1): B8
299*67e74705SXin Li // CHECK-NEXT:   Succs (2): B6 B5
300*67e74705SXin Li // CHECK:      [B8]
301*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
302*67e74705SXin Li // CHECK-NEXT:   2: A a;
303*67e74705SXin Li // CHECK-NEXT:   3: a
304*67e74705SXin Li // CHECK-NEXT:   4: [B8.3] (ImplicitCastExpr, NoOp, const class A)
305*67e74705SXin Li // CHECK-NEXT:   5: [B8.4] (CXXConstructExpr, class A)
306*67e74705SXin Li // CHECK-NEXT:   6: A b = a;
307*67e74705SXin Li // CHECK-NEXT:   7: b
308*67e74705SXin Li // CHECK-NEXT:   8: [B8.7] (ImplicitCastExpr, NoOp, const class A)
309*67e74705SXin Li // CHECK-NEXT:   9: [B8.8].operator int
310*67e74705SXin Li // CHECK:       10: [B8.8]
311*67e74705SXin Li // CHECK:       11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int)
312*67e74705SXin Li // CHECK:       12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
313*67e74705SXin Li // CHECK-NEXT:   T: if [B8.12]
314*67e74705SXin Li // CHECK-NEXT:   Preds (1): B9
315*67e74705SXin Li // CHECK-NEXT:   Succs (2): B7 B4
316*67e74705SXin Li // CHECK:      [B0 (EXIT)]
317*67e74705SXin Li // CHECK-NEXT:   Preds (3): B1 B3 B6
test_if_jumps()318*67e74705SXin Li void test_if_jumps() {
319*67e74705SXin Li   A a;
320*67e74705SXin Li   if (A b = a) {
321*67e74705SXin Li     A c;
322*67e74705SXin Li     if (UV) return;
323*67e74705SXin Li     A d;
324*67e74705SXin Li   } else {
325*67e74705SXin Li     A c;
326*67e74705SXin Li     if (UV) return;
327*67e74705SXin Li     A d;
328*67e74705SXin Li   }
329*67e74705SXin Li   A e;
330*67e74705SXin Li }
331*67e74705SXin Li 
332*67e74705SXin Li // CHECK:      [B6 (ENTRY)]
333*67e74705SXin Li // CHECK-NEXT:   Succs (1): B5
334*67e74705SXin Li // CHECK:      [B1]
335*67e74705SXin Li // CHECK-NEXT:   1: [B4.4].~A() (Implicit destructor)
336*67e74705SXin Li // CHECK-NEXT:   2: [B5.2].~A() (Implicit destructor)
337*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
338*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
339*67e74705SXin Li // CHECK:      [B2]
340*67e74705SXin Li // CHECK-NEXT:   Preds (1): B3
341*67e74705SXin Li // CHECK-NEXT:   Succs (1): B4
342*67e74705SXin Li // CHECK:      [B3]
343*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
344*67e74705SXin Li // CHECK-NEXT:   2: A c;
345*67e74705SXin Li // CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
346*67e74705SXin Li // CHECK-NEXT:   4: [B4.4].~A() (Implicit destructor)
347*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
348*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
349*67e74705SXin Li // CHECK:      [B4]
350*67e74705SXin Li // CHECK-NEXT:   1: a
351*67e74705SXin Li // CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
352*67e74705SXin Li // CHECK-NEXT:   3: [B4.2] (CXXConstructExpr, class A)
353*67e74705SXin Li // CHECK-NEXT:   4: A b = a;
354*67e74705SXin Li // CHECK-NEXT:   5: b
355*67e74705SXin Li // CHECK-NEXT:   6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
356*67e74705SXin Li // CHECK-NEXT:   7: [B4.6].operator int
357*67e74705SXin Li // CHECK-NEXT:   8: [B4.6]
358*67e74705SXin Li // CHECK-NEXT:   9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
359*67e74705SXin Li // CHECK:       10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
360*67e74705SXin Li // CHECK-NEXT:   T: while [B4.10]
361*67e74705SXin Li // CHECK-NEXT:   Preds (2): B2 B5
362*67e74705SXin Li // CHECK-NEXT:   Succs (2): B3 B1
363*67e74705SXin Li // CHECK:      [B5]
364*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
365*67e74705SXin Li // CHECK-NEXT:   2: A a;
366*67e74705SXin Li // CHECK-NEXT:   Preds (1): B6
367*67e74705SXin Li // CHECK-NEXT:   Succs (1): B4
368*67e74705SXin Li // CHECK:      [B0 (EXIT)]
369*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_while_implicit_scope()370*67e74705SXin Li void test_while_implicit_scope() {
371*67e74705SXin Li   A a;
372*67e74705SXin Li   while (A b = a)
373*67e74705SXin Li     A c;
374*67e74705SXin Li }
375*67e74705SXin Li 
376*67e74705SXin Li // CHECK:      [B12 (ENTRY)]
377*67e74705SXin Li // CHECK-NEXT:   Succs (1): B11
378*67e74705SXin Li // CHECK:      [B1]
379*67e74705SXin Li // CHECK-NEXT:   1: [B10.4].~A() (Implicit destructor)
380*67e74705SXin Li // CHECK-NEXT:   2:  (CXXConstructExpr, class A)
381*67e74705SXin Li // CHECK-NEXT:   3: A e;
382*67e74705SXin Li // CHECK-NEXT:   4: [B1.3].~A() (Implicit destructor)
383*67e74705SXin Li // CHECK-NEXT:   5: [B11.2].~A() (Implicit destructor)
384*67e74705SXin Li // CHECK-NEXT:   Preds (2): B8 B10
385*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
386*67e74705SXin Li // CHECK:      [B2]
387*67e74705SXin Li // CHECK-NEXT:   Preds (2): B3 B6
388*67e74705SXin Li // CHECK-NEXT:   Succs (1): B10
389*67e74705SXin Li // CHECK:      [B3]
390*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
391*67e74705SXin Li // CHECK-NEXT:   2: A d;
392*67e74705SXin Li // CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
393*67e74705SXin Li // CHECK-NEXT:   4: [B9.2].~A() (Implicit destructor)
394*67e74705SXin Li // CHECK-NEXT:   5: [B10.4].~A() (Implicit destructor)
395*67e74705SXin Li // CHECK-NEXT:   Preds (1): B5
396*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
397*67e74705SXin Li // CHECK:      [B4]
398*67e74705SXin Li // CHECK-NEXT:   1: return;
399*67e74705SXin Li // CHECK-NEXT:   2: [B9.2].~A() (Implicit destructor)
400*67e74705SXin Li // CHECK-NEXT:   3: [B10.4].~A() (Implicit destructor)
401*67e74705SXin Li // CHECK-NEXT:   4: [B11.2].~A() (Implicit destructor)
402*67e74705SXin Li // CHECK-NEXT:   Preds (1): B5
403*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
404*67e74705SXin Li // CHECK:      [B5]
405*67e74705SXin Li // CHECK-NEXT:   1: UV
406*67e74705SXin Li // CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
407*67e74705SXin Li // CHECK-NEXT:   T: if [B5.2]
408*67e74705SXin Li // CHECK-NEXT:   Preds (1): B7
409*67e74705SXin Li // CHECK-NEXT:   Succs (2): B4 B3
410*67e74705SXin Li // CHECK:      [B6]
411*67e74705SXin Li // CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)
412*67e74705SXin Li // CHECK-NEXT:   2: [B10.4].~A() (Implicit destructor)
413*67e74705SXin Li // CHECK-NEXT:   T: continue;
414*67e74705SXin Li // CHECK:        Preds (1): B7
415*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
416*67e74705SXin Li // CHECK:      [B7]
417*67e74705SXin Li // CHECK-NEXT:   1: UV
418*67e74705SXin Li // CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
419*67e74705SXin Li // CHECK-NEXT:   T: if [B7.2]
420*67e74705SXin Li // CHECK-NEXT:   Preds (1): B9
421*67e74705SXin Li // CHECK-NEXT:   Succs (2): B6 B5
422*67e74705SXin Li // CHECK:      [B8]
423*67e74705SXin Li // CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)
424*67e74705SXin Li // CHECK-NEXT:   T: break;
425*67e74705SXin Li // CHECK:        Preds (1): B9
426*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
427*67e74705SXin Li // CHECK:      [B9]
428*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
429*67e74705SXin Li // CHECK-NEXT:   2: A c;
430*67e74705SXin Li // CHECK-NEXT:   3: UV
431*67e74705SXin Li // CHECK-NEXT:   4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
432*67e74705SXin Li // CHECK-NEXT:   T: if [B9.4]
433*67e74705SXin Li // CHECK-NEXT:   Preds (1): B10
434*67e74705SXin Li // CHECK-NEXT:   Succs (2): B8 B7
435*67e74705SXin Li // CHECK:      [B10]
436*67e74705SXin Li // CHECK-NEXT:   1: a
437*67e74705SXin Li // CHECK-NEXT:   2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
438*67e74705SXin Li // CHECK-NEXT:   3: [B10.2] (CXXConstructExpr, class A)
439*67e74705SXin Li // CHECK-NEXT:   4: A b = a;
440*67e74705SXin Li // CHECK-NEXT:   5: b
441*67e74705SXin Li // CHECK-NEXT:   6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
442*67e74705SXin Li // CHECK-NEXT:   7: [B10.6].operator int
443*67e74705SXin Li // CHECK-NEXT:   8: [B10.6]
444*67e74705SXin Li // CHECK-NEXT:   9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
445*67e74705SXin Li // CHECK:       10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
446*67e74705SXin Li // CHECK-NEXT:   T: while [B10.10]
447*67e74705SXin Li // CHECK-NEXT:   Preds (2): B2 B11
448*67e74705SXin Li // CHECK-NEXT:   Succs (2): B9 B1
449*67e74705SXin Li // CHECK:      [B11]
450*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
451*67e74705SXin Li // CHECK-NEXT:   2: A a;
452*67e74705SXin Li // CHECK-NEXT:   Preds (1): B12
453*67e74705SXin Li // CHECK-NEXT:   Succs (1): B10
454*67e74705SXin Li // CHECK:      [B0 (EXIT)]
455*67e74705SXin Li // CHECK-NEXT:   Preds (2): B1 B4
test_while_jumps()456*67e74705SXin Li void test_while_jumps() {
457*67e74705SXin Li   A a;
458*67e74705SXin Li   while (A b = a) {
459*67e74705SXin Li     A c;
460*67e74705SXin Li     if (UV) break;
461*67e74705SXin Li     if (UV) continue;
462*67e74705SXin Li     if (UV) return;
463*67e74705SXin Li     A d;
464*67e74705SXin Li   }
465*67e74705SXin Li   A e;
466*67e74705SXin Li }
467*67e74705SXin Li 
468*67e74705SXin Li // CHECK:      [B4 (ENTRY)]
469*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
470*67e74705SXin Li // CHECK:      [B1]
471*67e74705SXin Li // CHECK-NEXT:   1: UV
472*67e74705SXin Li // CHECK-NEXT:   2: [B1.1] (ImplicitCastExpr, LValueToRValue, _Bool)
473*67e74705SXin Li // CHECK-NEXT:   T: do ... while [B1.2]
474*67e74705SXin Li // CHECK-NEXT:   Preds (1): B2
475*67e74705SXin Li // CHECK-NEXT:   Succs (2): B3 B0
476*67e74705SXin Li // CHECK:      [B2]
477*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
478*67e74705SXin Li // CHECK-NEXT:   2: A a;
479*67e74705SXin Li // CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)
480*67e74705SXin Li // CHECK-NEXT:   Preds (2): B3 B4
481*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
482*67e74705SXin Li // CHECK:      [B3]
483*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
484*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
485*67e74705SXin Li // CHECK:      [B0 (EXIT)]
486*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_do_implicit_scope()487*67e74705SXin Li void test_do_implicit_scope() {
488*67e74705SXin Li   do A a;
489*67e74705SXin Li   while (UV);
490*67e74705SXin Li }
491*67e74705SXin Li 
492*67e74705SXin Li // CHECK:      [B12 (ENTRY)]
493*67e74705SXin Li // CHECK-NEXT:   Succs (1): B11
494*67e74705SXin Li // CHECK:      [B1]
495*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
496*67e74705SXin Li // CHECK-NEXT:   2: A d;
497*67e74705SXin Li // CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)
498*67e74705SXin Li // CHECK-NEXT:   4: [B11.2].~A() (Implicit destructor)
499*67e74705SXin Li // CHECK-NEXT:   Preds (2): B8 B2
500*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
501*67e74705SXin Li // CHECK:      [B2]
502*67e74705SXin Li // CHECK-NEXT:   1: UV
503*67e74705SXin Li // CHECK-NEXT:   2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)
504*67e74705SXin Li // CHECK-NEXT:   T: do ... while [B2.2]
505*67e74705SXin Li // CHECK-NEXT:   Preds (2): B3 B6
506*67e74705SXin Li // CHECK-NEXT:   Succs (2): B10 B1
507*67e74705SXin Li // CHECK:      [B3]
508*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
509*67e74705SXin Li // CHECK-NEXT:   2: A c;
510*67e74705SXin Li // CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
511*67e74705SXin Li // CHECK-NEXT:   4: [B9.2].~A() (Implicit destructor)
512*67e74705SXin Li // CHECK-NEXT:   Preds (1): B5
513*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
514*67e74705SXin Li // CHECK:      [B4]
515*67e74705SXin Li // CHECK-NEXT:   1: return;
516*67e74705SXin Li // CHECK-NEXT:   2: [B9.2].~A() (Implicit destructor)
517*67e74705SXin Li // CHECK-NEXT:   3: [B11.2].~A() (Implicit destructor)
518*67e74705SXin Li // CHECK-NEXT:   Preds (1): B5
519*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
520*67e74705SXin Li // CHECK:      [B5]
521*67e74705SXin Li // CHECK-NEXT:   1: UV
522*67e74705SXin Li // CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
523*67e74705SXin Li // CHECK-NEXT:   T: if [B5.2]
524*67e74705SXin Li // CHECK-NEXT:   Preds (1): B7
525*67e74705SXin Li // CHECK-NEXT:   Succs (2): B4 B3
526*67e74705SXin Li // CHECK:      [B6]
527*67e74705SXin Li // CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)
528*67e74705SXin Li // CHECK-NEXT:   T: continue;
529*67e74705SXin Li // CHECK:        Preds (1): B7
530*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
531*67e74705SXin Li // CHECK:      [B7]
532*67e74705SXin Li // CHECK-NEXT:   1: UV
533*67e74705SXin Li // CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
534*67e74705SXin Li // CHECK-NEXT:   T: if [B7.2]
535*67e74705SXin Li // CHECK-NEXT:   Preds (1): B9
536*67e74705SXin Li // CHECK-NEXT:   Succs (2): B6 B5
537*67e74705SXin Li // CHECK:      [B8]
538*67e74705SXin Li // CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)
539*67e74705SXin Li // CHECK-NEXT:   T: break;
540*67e74705SXin Li // CHECK:        Preds (1): B9
541*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
542*67e74705SXin Li // CHECK:      [B9]
543*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
544*67e74705SXin Li // CHECK-NEXT:   2: A b;
545*67e74705SXin Li // CHECK-NEXT:   3: UV
546*67e74705SXin Li // CHECK-NEXT:   4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
547*67e74705SXin Li // CHECK-NEXT:   T: if [B9.4]
548*67e74705SXin Li // CHECK-NEXT:   Preds (2): B10 B11
549*67e74705SXin Li // CHECK-NEXT:   Succs (2): B8 B7
550*67e74705SXin Li // CHECK:      [B10]
551*67e74705SXin Li // CHECK-NEXT:   Preds (1): B2
552*67e74705SXin Li // CHECK-NEXT:   Succs (1): B9
553*67e74705SXin Li // CHECK:      [B11]
554*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
555*67e74705SXin Li // CHECK-NEXT:   2: A a;
556*67e74705SXin Li // CHECK-NEXT:   Preds (1): B12
557*67e74705SXin Li // CHECK-NEXT:   Succs (1): B9
558*67e74705SXin Li // CHECK:      [B0 (EXIT)]
559*67e74705SXin Li // CHECK-NEXT:   Preds (2): B1 B4
test_do_jumps()560*67e74705SXin Li void test_do_jumps() {
561*67e74705SXin Li   A a;
562*67e74705SXin Li   do {
563*67e74705SXin Li     A b;
564*67e74705SXin Li     if (UV) break;
565*67e74705SXin Li     if (UV) continue;
566*67e74705SXin Li     if (UV) return;
567*67e74705SXin Li     A c;
568*67e74705SXin Li   } while (UV);
569*67e74705SXin Li   A d;
570*67e74705SXin Li }
571*67e74705SXin Li 
572*67e74705SXin Li // CHECK:      [B4 (ENTRY)]
573*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
574*67e74705SXin Li // CHECK:      [B1]
575*67e74705SXin Li // CHECK-NEXT:   1: [B2.6].~A() (Implicit destructor)
576*67e74705SXin Li // CHECK-NEXT:   2: [B2.2].~A() (Implicit destructor)
577*67e74705SXin Li // CHECK-NEXT:   Preds (2): B3 B2
578*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
579*67e74705SXin Li // CHECK:      [B2]
580*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
581*67e74705SXin Li // CHECK-NEXT:   2: A a;
582*67e74705SXin Li // CHECK-NEXT:   3: a
583*67e74705SXin Li // CHECK-NEXT:   4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
584*67e74705SXin Li // CHECK-NEXT:   5: [B2.4] (CXXConstructExpr, class A)
585*67e74705SXin Li // CHECK-NEXT:   6: A b = a;
586*67e74705SXin Li // CHECK-NEXT:   7: b
587*67e74705SXin Li // CHECK-NEXT:   8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
588*67e74705SXin Li // CHECK-NEXT:   9: [B2.8].operator int
589*67e74705SXin Li // CHECK:       10: [B2.8]
590*67e74705SXin Li // CHECK:       11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
591*67e74705SXin Li // CHECK-NEXT:   T: switch [B2.11]
592*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
593*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
594*67e74705SXin Li // CHECK:      [B3]
595*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
596*67e74705SXin Li // CHECK-NEXT:   2: A c;
597*67e74705SXin Li // CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
598*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
599*67e74705SXin Li // CHECK:      [B0 (EXIT)]
600*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_switch_implicit_scope()601*67e74705SXin Li void test_switch_implicit_scope() {
602*67e74705SXin Li   A a;
603*67e74705SXin Li   switch (A b = a)
604*67e74705SXin Li     A c;
605*67e74705SXin Li }
606*67e74705SXin Li 
607*67e74705SXin Li // CHECK:      [B9 (ENTRY)]
608*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
609*67e74705SXin Li // CHECK:      [B1]
610*67e74705SXin Li // CHECK-NEXT:   1: [B2.6].~A() (Implicit destructor)
611*67e74705SXin Li // CHECK-NEXT:   2:  (CXXConstructExpr, class A)
612*67e74705SXin Li // CHECK-NEXT:   3: A g;
613*67e74705SXin Li // CHECK-NEXT:   4: [B1.3].~A() (Implicit destructor)
614*67e74705SXin Li // CHECK-NEXT:   5: [B2.2].~A() (Implicit destructor)
615*67e74705SXin Li // CHECK-NEXT:   Preds (3): B3 B7 B2
616*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
617*67e74705SXin Li // CHECK:      [B2]
618*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
619*67e74705SXin Li // CHECK-NEXT:   2: A a;
620*67e74705SXin Li // CHECK-NEXT:   3: a
621*67e74705SXin Li // CHECK-NEXT:   4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
622*67e74705SXin Li // CHECK-NEXT:   5: [B2.4] (CXXConstructExpr, class A)
623*67e74705SXin Li // CHECK-NEXT:   6: A b = a;
624*67e74705SXin Li // CHECK-NEXT:   7: b
625*67e74705SXin Li // CHECK-NEXT:   8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
626*67e74705SXin Li // CHECK-NEXT:   9: [B2.8].operator int
627*67e74705SXin Li // CHECK:       10: [B2.8]
628*67e74705SXin Li // CHECK:       11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
629*67e74705SXin Li // CHECK-NEXT:   T: switch [B2.11]
630*67e74705SXin Li // CHECK-NEXT:   Preds (1): B9
631*67e74705SXin Li // CHECK-NEXT:   Succs (3): B3 B8 B1
632*67e74705SXin Li // CHECK:      [B3]
633*67e74705SXin Li // CHECK:       case 1:
634*67e74705SXin Li // CHECK-NEXT:   T: break;
635*67e74705SXin Li // CHECK:        Preds (2): B2 B4
636*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
637*67e74705SXin Li // CHECK:      [B4]
638*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
639*67e74705SXin Li // CHECK-NEXT:   2: A f;
640*67e74705SXin Li // CHECK-NEXT:   3: [B4.2].~A() (Implicit destructor)
641*67e74705SXin Li // CHECK-NEXT:   4: [B8.2].~A() (Implicit destructor)
642*67e74705SXin Li // CHECK-NEXT:   Preds (1): B6
643*67e74705SXin Li // CHECK-NEXT:   Succs (1): B3
644*67e74705SXin Li // CHECK:      [B5]
645*67e74705SXin Li // CHECK-NEXT:   1: return;
646*67e74705SXin Li // CHECK-NEXT:   2: [B8.2].~A() (Implicit destructor)
647*67e74705SXin Li // CHECK-NEXT:   3: [B2.6].~A() (Implicit destructor)
648*67e74705SXin Li // CHECK-NEXT:   4: [B2.2].~A() (Implicit destructor)
649*67e74705SXin Li // CHECK-NEXT:   Preds (1): B6
650*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
651*67e74705SXin Li // CHECK:      [B6]
652*67e74705SXin Li // CHECK-NEXT:   1: UV
653*67e74705SXin Li // CHECK-NEXT:   2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
654*67e74705SXin Li // CHECK-NEXT:   T: if [B6.2]
655*67e74705SXin Li // CHECK-NEXT:   Preds (1): B8
656*67e74705SXin Li // CHECK-NEXT:   Succs (2): B5 B4
657*67e74705SXin Li // CHECK:      [B7]
658*67e74705SXin Li // CHECK-NEXT:   1: [B8.2].~A() (Implicit destructor)
659*67e74705SXin Li // CHECK-NEXT:   T: break;
660*67e74705SXin Li // CHECK:        Preds (1): B8
661*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
662*67e74705SXin Li // CHECK:      [B8]
663*67e74705SXin Li // CHECK:       case 0:
664*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
665*67e74705SXin Li // CHECK-NEXT:   2: A c;
666*67e74705SXin Li // CHECK-NEXT:   3: UV
667*67e74705SXin Li // CHECK-NEXT:   4: [B8.3] (ImplicitCastExpr, LValueToRValue, _Bool)
668*67e74705SXin Li // CHECK-NEXT:   T: if [B8.4]
669*67e74705SXin Li // CHECK-NEXT:   Preds (1): B2
670*67e74705SXin Li // CHECK-NEXT:   Succs (2): B7 B6
671*67e74705SXin Li // CHECK:      [B0 (EXIT)]
672*67e74705SXin Li // CHECK-NEXT:   Preds (2): B1 B5
test_switch_jumps()673*67e74705SXin Li void test_switch_jumps() {
674*67e74705SXin Li   A a;
675*67e74705SXin Li   switch (A b = a) {
676*67e74705SXin Li   case 0: {
677*67e74705SXin Li     A c;
678*67e74705SXin Li     if (UV) break;
679*67e74705SXin Li     if (UV) return;
680*67e74705SXin Li     A f;
681*67e74705SXin Li   }
682*67e74705SXin Li   case 1:
683*67e74705SXin Li     break;
684*67e74705SXin Li   }
685*67e74705SXin Li   A g;
686*67e74705SXin Li }
687*67e74705SXin Li 
688*67e74705SXin Li // CHECK:      [B6 (ENTRY)]
689*67e74705SXin Li // CHECK-NEXT:   Succs (1): B5
690*67e74705SXin Li // CHECK:      [B1]
691*67e74705SXin Li // CHECK-NEXT:   1: [B4.4].~A() (Implicit destructor)
692*67e74705SXin Li // CHECK-NEXT:   2: [B5.2].~A() (Implicit destructor)
693*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
694*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
695*67e74705SXin Li // CHECK:      [B2]
696*67e74705SXin Li // CHECK-NEXT:   Preds (1): B3
697*67e74705SXin Li // CHECK-NEXT:   Succs (1): B4
698*67e74705SXin Li // CHECK:      [B3]
699*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
700*67e74705SXin Li // CHECK-NEXT:   2: A c;
701*67e74705SXin Li // CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
702*67e74705SXin Li // CHECK-NEXT:   4: [B4.4].~A() (Implicit destructor)
703*67e74705SXin Li // CHECK-NEXT:   Preds (1): B4
704*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
705*67e74705SXin Li // CHECK:      [B4]
706*67e74705SXin Li // CHECK-NEXT:   1: a
707*67e74705SXin Li // CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
708*67e74705SXin Li // CHECK-NEXT:   3: [B4.2] (CXXConstructExpr, class A)
709*67e74705SXin Li // CHECK-NEXT:   4: A b = a;
710*67e74705SXin Li // CHECK-NEXT:   5: b
711*67e74705SXin Li // CHECK-NEXT:   6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
712*67e74705SXin Li // CHECK-NEXT:   7: [B4.6].operator int
713*67e74705SXin Li // CHECK-NEXT:   8: [B4.6]
714*67e74705SXin Li // CHECK-NEXT:   9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
715*67e74705SXin Li // CHECK:       10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
716*67e74705SXin Li // CHECK-NEXT:   T: for (...; [B4.10]; )
717*67e74705SXin Li // CHECK-NEXT:   Preds (2): B2 B5
718*67e74705SXin Li // CHECK-NEXT:   Succs (2): B3 B1
719*67e74705SXin Li // CHECK:      [B5]
720*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
721*67e74705SXin Li // CHECK-NEXT:   2: A a;
722*67e74705SXin Li // CHECK-NEXT:   Preds (1): B6
723*67e74705SXin Li // CHECK-NEXT:   Succs (1): B4
724*67e74705SXin Li // CHECK:      [B0 (EXIT)]
725*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
test_for_implicit_scope()726*67e74705SXin Li void test_for_implicit_scope() {
727*67e74705SXin Li   for (A a; A b = a; )
728*67e74705SXin Li     A c;
729*67e74705SXin Li }
730*67e74705SXin Li 
731*67e74705SXin Li // CHECK:      [B12 (ENTRY)]
732*67e74705SXin Li // CHECK-NEXT:   Succs (1): B11
733*67e74705SXin Li // CHECK:      [B1]
734*67e74705SXin Li // CHECK-NEXT:   1: [B10.4].~A() (Implicit destructor)
735*67e74705SXin Li // CHECK-NEXT:   2: [B11.4].~A() (Implicit destructor)
736*67e74705SXin Li // CHECK-NEXT:   3:  (CXXConstructExpr, class A)
737*67e74705SXin Li // CHECK-NEXT:   4: A f;
738*67e74705SXin Li // CHECK-NEXT:   5: [B1.4].~A() (Implicit destructor)
739*67e74705SXin Li // CHECK-NEXT:   6: [B11.2].~A() (Implicit destructor)
740*67e74705SXin Li // CHECK-NEXT:   Preds (2): B8 B10
741*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
742*67e74705SXin Li // CHECK:      [B2]
743*67e74705SXin Li // CHECK-NEXT:   Preds (2): B3 B6
744*67e74705SXin Li // CHECK-NEXT:   Succs (1): B10
745*67e74705SXin Li // CHECK:      [B3]
746*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
747*67e74705SXin Li // CHECK-NEXT:   2: A e;
748*67e74705SXin Li // CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)
749*67e74705SXin Li // CHECK-NEXT:   4: [B9.2].~A() (Implicit destructor)
750*67e74705SXin Li // CHECK-NEXT:   5: [B10.4].~A() (Implicit destructor)
751*67e74705SXin Li // CHECK-NEXT:   Preds (1): B5
752*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
753*67e74705SXin Li // CHECK:      [B4]
754*67e74705SXin Li // CHECK-NEXT:   1: return;
755*67e74705SXin Li // CHECK-NEXT:   2: [B9.2].~A() (Implicit destructor)
756*67e74705SXin Li // CHECK-NEXT:   3: [B10.4].~A() (Implicit destructor)
757*67e74705SXin Li // CHECK-NEXT:   4: [B11.4].~A() (Implicit destructor)
758*67e74705SXin Li // CHECK-NEXT:   5: [B11.2].~A() (Implicit destructor)
759*67e74705SXin Li // CHECK-NEXT:   Preds (1): B5
760*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
761*67e74705SXin Li // CHECK:      [B5]
762*67e74705SXin Li // CHECK-NEXT:   1: UV
763*67e74705SXin Li // CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
764*67e74705SXin Li // CHECK-NEXT:   T: if [B5.2]
765*67e74705SXin Li // CHECK-NEXT:   Preds (1): B7
766*67e74705SXin Li // CHECK-NEXT:   Succs (2): B4 B3
767*67e74705SXin Li // CHECK:      [B6]
768*67e74705SXin Li // CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)
769*67e74705SXin Li // CHECK-NEXT:   T: continue;
770*67e74705SXin Li // CHECK:        Preds (1): B7
771*67e74705SXin Li // CHECK-NEXT:   Succs (1): B2
772*67e74705SXin Li // CHECK:      [B7]
773*67e74705SXin Li // CHECK-NEXT:   1: UV
774*67e74705SXin Li // CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
775*67e74705SXin Li // CHECK-NEXT:   T: if [B7.2]
776*67e74705SXin Li // CHECK-NEXT:   Preds (1): B9
777*67e74705SXin Li // CHECK-NEXT:   Succs (2): B6 B5
778*67e74705SXin Li // CHECK:      [B8]
779*67e74705SXin Li // CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)
780*67e74705SXin Li // CHECK-NEXT:   T: break;
781*67e74705SXin Li // CHECK:        Preds (1): B9
782*67e74705SXin Li // CHECK-NEXT:   Succs (1): B1
783*67e74705SXin Li // CHECK:      [B9]
784*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
785*67e74705SXin Li // CHECK-NEXT:   2: A d;
786*67e74705SXin Li // CHECK-NEXT:   3: UV
787*67e74705SXin Li // CHECK-NEXT:   4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
788*67e74705SXin Li // CHECK-NEXT:   T: if [B9.4]
789*67e74705SXin Li // CHECK-NEXT:   Preds (1): B10
790*67e74705SXin Li // CHECK-NEXT:   Succs (2): B8 B7
791*67e74705SXin Li // CHECK:      [B10]
792*67e74705SXin Li // CHECK-NEXT:   1: b
793*67e74705SXin Li // CHECK-NEXT:   2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
794*67e74705SXin Li // CHECK-NEXT:   3: [B10.2] (CXXConstructExpr, class A)
795*67e74705SXin Li // CHECK-NEXT:   4: A c = b;
796*67e74705SXin Li // CHECK-NEXT:   5: c
797*67e74705SXin Li // CHECK-NEXT:   6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
798*67e74705SXin Li // CHECK-NEXT:   7: [B10.6].operator int
799*67e74705SXin Li // CHECK-NEXT:   8: [B10.6]
800*67e74705SXin Li // CHECK-NEXT:   9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
801*67e74705SXin Li // CHECK:       10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
802*67e74705SXin Li // CHECK-NEXT:   T: for (...; [B10.10]; )
803*67e74705SXin Li // CHECK-NEXT:   Preds (2): B2 B11
804*67e74705SXin Li // CHECK-NEXT:   Succs (2): B9 B1
805*67e74705SXin Li // CHECK:      [B11]
806*67e74705SXin Li // CHECK-NEXT:   1:  (CXXConstructExpr, class A)
807*67e74705SXin Li // CHECK-NEXT:   2: A a;
808*67e74705SXin Li // CHECK-NEXT:   3:  (CXXConstructExpr, class A)
809*67e74705SXin Li // CHECK-NEXT:   4: A b;
810*67e74705SXin Li // CHECK-NEXT:   Preds (1): B12
811*67e74705SXin Li // CHECK-NEXT:   Succs (1): B10
812*67e74705SXin Li // CHECK:      [B0 (EXIT)]
813*67e74705SXin Li // CHECK-NEXT:   Preds (2): B1 B4
test_for_jumps()814*67e74705SXin Li void test_for_jumps() {
815*67e74705SXin Li   A a;
816*67e74705SXin Li   for (A b; A c = b; ) {
817*67e74705SXin Li     A d;
818*67e74705SXin Li     if (UV) break;
819*67e74705SXin Li     if (UV) continue;
820*67e74705SXin Li     if (UV) return;
821*67e74705SXin Li     A e;
822*67e74705SXin Li   }
823*67e74705SXin Li   A f;
824*67e74705SXin Li }
825*67e74705SXin Li 
826*67e74705SXin Li // CHECK:      [B3 (ENTRY)]
827*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
828*67e74705SXin Li // CHECK:      [B1]
829*67e74705SXin Li // CHECK-NEXT:   T: try ...
830*67e74705SXin Li // CHECK-NEXT:   Succs (2): B2 B0
831*67e74705SXin Li // CHECK:      [B2]
832*67e74705SXin Li // CHECK-NEXT:  catch (const A &e):
833*67e74705SXin Li // CHECK-NEXT:   1: catch (const A &e) {
834*67e74705SXin Li // CHECK-NEXT:  }
835*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
836*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
837*67e74705SXin Li // CHECK:      [B0 (EXIT)]
838*67e74705SXin Li // CHECK-NEXT:   Preds (3): B2 B1 B3
test_catch_const_ref()839*67e74705SXin Li void test_catch_const_ref() {
840*67e74705SXin Li   try {
841*67e74705SXin Li   } catch (const A& e) {
842*67e74705SXin Li   }
843*67e74705SXin Li }
844*67e74705SXin Li 
845*67e74705SXin Li // CHECK:      [B3 (ENTRY)]
846*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
847*67e74705SXin Li // CHECK:      [B1]
848*67e74705SXin Li // CHECK-NEXT:   T: try ...
849*67e74705SXin Li // CHECK-NEXT:   Succs (2): B2 B0
850*67e74705SXin Li // CHECK:      [B2]
851*67e74705SXin Li // CHECK-NEXT:  catch (A e):
852*67e74705SXin Li // CHECK-NEXT:   1: catch (A e) {
853*67e74705SXin Li // CHECK-NEXT:  }
854*67e74705SXin Li // CHECK-NEXT:   2: [B2.1].~A() (Implicit destructor)
855*67e74705SXin Li // CHECK-NEXT:   Preds (1): B1
856*67e74705SXin Li // CHECK-NEXT:   Succs (1): B0
857*67e74705SXin Li // CHECK:      [B0 (EXIT)]
858*67e74705SXin Li // CHECK-NEXT:   Preds (3): B2 B1 B3
test_catch_copy()859*67e74705SXin Li void test_catch_copy() {
860*67e74705SXin Li   try {
861*67e74705SXin Li   } catch (A e) {
862*67e74705SXin Li   }
863*67e74705SXin Li }
864