Clang Project

clang_source_code/test/AST/ast-dump-stmt.c
1// RUN: %clang_cc1 -std=gnu11 -ast-dump %s | FileCheck -strict-whitespace %s
2
3int TestLocation = 0;
4// CHECK:      VarDecl{{.*}}TestLocation
5// CHECK-NEXT:   IntegerLiteral 0x{{[^ ]*}} <col:20> 'int' 0
6
7int TestIndent = 1 + (1);
8// CHECK:      VarDecl{{.*}}TestIndent
9// CHECK-NEXT: {{^}}| `-BinaryOperator{{[^()]*$}}
10// CHECK-NEXT: {{^}}|   |-IntegerLiteral{{.*0[^()]*$}}
11// CHECK-NEXT: {{^}}|   `-ParenExpr{{.*0[^()]*$}}
12// CHECK-NEXT: {{^}}|     `-IntegerLiteral{{.*0[^()]*$}}
13
14void TestDeclStmt() {
15  int x = 0;
16  int y, z;
17}
18// CHECK:      FunctionDecl{{.*}}TestDeclStmt
19// CHECK-NEXT: CompoundStmt
20// CHECK-NEXT:   DeclStmt
21// CHECK-NEXT:     VarDecl{{.*}}x
22// CHECK-NEXT:       IntegerLiteral
23// CHECK-NEXT:   DeclStmt
24// CHECK-NEXT:     VarDecl{{.*}}y
25// CHECK-NEXT:     VarDecl{{.*}}z
26
27int TestOpaqueValueExpr = 0 ?: 1;
28// CHECK:      VarDecl{{.*}}TestOpaqueValueExpr
29// CHECK-NEXT: BinaryConditionalOperator
30// CHECK-NEXT:   IntegerLiteral
31// CHECK-NEXT:   OpaqueValueExpr
32// CHECK-NEXT:     IntegerLiteral
33// CHECK-NEXT:   OpaqueValueExpr
34// CHECK-NEXT:     IntegerLiteral
35// CHECK-NEXT:   IntegerLiteral
36
37void TestUnaryOperatorExpr(void) {
38  char T1 = 1;
39  int T2 = 1;
40
41  T1++;
42  T2++;
43  // CHECK:      UnaryOperator{{.*}}postfix '++' cannot overflow
44  // CHECK-NEXT:   DeclRefExpr{{.*}}'T1' 'char'
45  // CHECK-NOT:  UnaryOperator{{.*}}postfix '++' cannot overflow
46  // CHECK:        DeclRefExpr{{.*}}'T2' 'int'
47
48  -T1;
49  -T2;
50  // CHECK:      UnaryOperator{{.*}}prefix '-' cannot overflow
51  // CHECK-NEXT:   ImplicitCastExpr
52  // CHECK-NEXT:     ImplicitCastExpr
53  // CHECK-NEXT:       DeclRefExpr{{.*}}'T1' 'char'
54  // CHECK-NOT:  UnaryOperator{{.*}}prefix '-' cannot overflow
55  // CHECK:        ImplicitCastExpr
56  // CHECK:          DeclRefExpr{{.*}}'T2' 'int'
57
58  ~T1;
59  ~T2;
60  // CHECK:      UnaryOperator{{.*}}prefix '~' cannot overflow
61  // CHECK-NEXT:   ImplicitCastExpr
62  // CHECK-NEXT:     ImplicitCastExpr
63  // CHECK-NEXT:       DeclRefExpr{{.*}}'T1' 'char'
64  // CHECK:    UnaryOperator{{.*}}prefix '~' cannot overflow
65  // CHECK-NEXT:     ImplicitCastExpr
66  // CHECK-NEXT:       DeclRefExpr{{.*}}'T2' 'int'
67}
68
69void TestGenericSelectionExpressions(int i) {
70  _Generic(i, int : 12);
71  // CHECK: GenericSelectionExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:23> 'int'
72  // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}}
73  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int'
74  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
75  // FIXME: note that the following test line has a spurious whitespace.
76  // CHECK-NEXT: case  'int' selected
77  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
78  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:21> 'int' 12
79  _Generic(i, int : 12, default : 0);
80  // CHECK: GenericSelectionExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:36> 'int'
81  // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}}
82  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int'
83  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
84  // FIXME: note that the following test line has a spurious whitespace.
85  // CHECK-NEXT: case  'int' selected
86  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
87  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:21> 'int' 12
88  // CHECK-NEXT: default
89  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:35> 'int' 0
90  _Generic(i, default : 0, int : 12);
91  // CHECK: GenericSelectionExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:36> 'int'
92  // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}}
93  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int'
94  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
95  // CHECK-NEXT: default
96  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:25> 'int' 0
97  // FIXME: note that the following test line has a spurious whitespace.
98  // CHECK-NEXT: case  'int' selected
99  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
100  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:34> 'int' 12
101  _Generic(i, int : 12, float : 10, default : 100);
102  // CHECK: GenericSelectionExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:50> 'int'
103  // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}}
104  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int'
105  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
106  // FIXME: note that the following test line has a spurious whitespace.
107  // CHECK-NEXT: case  'int' selected
108  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
109  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:21> 'int' 12
110  // FIXME: note that the following test line has a spurious whitespace.
111  // CHECK-NEXT: case  'float'
112  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'float'
113  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:33> 'int' 10
114  // CHECK-NEXT: default
115  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:47> 'int' 100
116
117  int j = _Generic(i, int : 12);
118  // CHECK: DeclStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:32>
119  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:3, col:31> col:7 j 'int' cinit
120  // CHECK-NEXT: GenericSelectionExpr 0x{{[^ ]*}} <col:11, col:31> 'int'
121  // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}}
122  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:20> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int'
123  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
124  // FIXME: note that the following test line has a spurious whitespace.
125  // CHECK-NEXT: case  'int' selected
126  // CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'int'
127  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:29> 'int' 12
128}
129
130void TestLabelsAndGoto(void) {
131  // Note: case and default labels are handled by TestSwitch().
132
133label1:
134  ;
135  // CHECK: LabelStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:1, line:[[@LINE-1]]:3> 'label1'
136  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <col:3>
137
138  goto label2;
139  // CHECK-NEXT: GotoStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'label2' 0x{{[^ ]*}}
140
141label2:
142  0;
143  // CHECK-NEXT: LabelStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:1, line:[[@LINE-1]]:3> 'label2'
144  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:3> 'int' 0
145
146  void *ptr = &&label1;
147  // CHECK-NEXT: DeclStmt
148  // CHECK-NEXT: VarDecl
149  // CHECK-NEXT: AddrLabelExpr 0x{{[^ ]*}} <col:15, col:17> 'void *' label1 0x{{[^ ]*}}
150
151  goto *ptr;
152  // CHECK-NEXT: IndirectGotoStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9>
153  // CHECK-NEXT: ImplicitCastExpr
154  // CHECK-NEXT: ImplicitCastExpr
155  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:9> 'void *' lvalue Var 0x{{[^ ]*}} 'ptr' 'void *'
156}
157
158void TestSwitch(int i) {
159  switch (i) {
160  // CHECK: SwitchStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+32]]:3>
161  // CHECK-NEXT: ImplicitCastExpr
162  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int'
163  // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:14, line:[[@LINE+29]]:3>
164  case 0:
165    break;
166  // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
167  // CHECK-NEXT: ConstantExpr
168  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 0
169  // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:5>
170  case 1:
171  case 2:
172    break;
173  // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} <line:[[@LINE-3]]:3, line:[[@LINE-1]]:5>
174  // CHECK-NEXT: ConstantExpr
175  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 1
176  // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} <line:[[@LINE-5]]:3, line:[[@LINE-4]]:5>
177  // CHECK-NEXT: ConstantExpr
178  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 2
179  // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} <line:[[@LINE-7]]:5>
180  default:
181    break;
182  // CHECK-NEXT: DefaultStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
183  // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} <col:5>
184  case 3 ... 5:
185    break;
186  // CHECK-NEXT: CaseStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> gnu_range
187  // CHECK-NEXT: ConstantExpr
188  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 3
189  // CHECK-NEXT: ConstantExpr
190  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 5
191  // CHECK-NEXT: BreakStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:5>
192  }
193}
194
195void TestIf(_Bool b) {
196  if (b)
197    ;
198  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
199  // CHECK-NEXT: ImplicitCastExpr
200  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
201  // CHECK-NEXT: NullStmt
202
203  if (b) {}
204  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11>
205  // CHECK-NEXT: ImplicitCastExpr
206  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
207  // CHECK-NEXT: CompoundStmt
208
209  if (b)
210    ;
211  else
212    ;
213  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:3, line:[[@LINE-1]]:5> has_else
214  // CHECK-NEXT: ImplicitCastExpr
215  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
216  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:5>
217  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-5]]:5>
218
219  if (b) {}
220  else {}
221  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:9> has_else
222  // CHECK-NEXT: ImplicitCastExpr
223  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
224  // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:10, col:11>
225  // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <line:[[@LINE-5]]:8, col:9>
226
227  if (b)
228    ;
229  else if (b)
230    ;
231  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:3, line:[[@LINE-1]]:5> has_else
232  // CHECK-NEXT: ImplicitCastExpr
233  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
234  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:5>
235  // CHECK-NEXT: IfStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:8, line:[[@LINE-5]]:5>
236  // CHECK-NEXT: ImplicitCastExpr
237  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
238  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-8]]:5>
239
240  if (b)
241    ;
242  else if (b)
243    ;
244  else
245    ;
246  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-6]]:3, line:[[@LINE-1]]:5> has_else
247  // CHECK-NEXT: ImplicitCastExpr
248  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
249  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-8]]:5>
250  // CHECK-NEXT: IfStmt 0x{{[^ ]*}} <line:[[@LINE-8]]:8, line:[[@LINE-5]]:5> has_else
251  // CHECK-NEXT: ImplicitCastExpr
252  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
253  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-10]]:5>
254  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-9]]:5>
255}
256
257void TestIteration(_Bool b) {
258  while (b)
259    ;
260  // CHECK: WhileStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
261  // CHECK-NEXT: ImplicitCastExpr
262  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
263  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:5>
264
265  do
266    ;
267  while (b);
268  // CHECK: DoStmt 0x{{[^ ]*}} <line:[[@LINE-3]]:3, line:[[@LINE-1]]:11>
269  // CHECK-NEXT: NullStmt 0x{{[^ ]*}} <line:[[@LINE-3]]:5>
270  // CHECK-NEXT: ImplicitCastExpr
271  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
272
273  for (int i = 0; i < 10; ++i)
274    ;
275  // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
276  // CHECK-NEXT: DeclStmt
277  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:8, col:16> col:12 used i 'int' cinit
278  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'int' 0
279  // CHECK-NEXT: <<<NULL>>>
280  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '<'
281  // CHECK-NEXT: ImplicitCastExpr
282  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'int' lvalue Var 0x{{[^ ]*}} 'i' 'int'
283  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:23> 'int' 10
284  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:27, col:29> 'int' prefix '++'
285  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:29> 'int' lvalue Var 0x{{[^ ]*}} 'i' 'int'
286  // CHECK-NEXT: NullStmt
287
288  for (b; b; b)
289    ;
290  // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
291  // CHECK-NEXT: ImplicitCastExpr
292  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
293  // CHECK-NEXT: <<<NULL>>>
294  // CHECK-NEXT: ImplicitCastExpr
295  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
296  // CHECK-NEXT: ImplicitCastExpr
297  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
298  // CHECK-NEXT: NullStmt
299
300  for (; b; b = !b)
301    ;
302  // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
303  // CHECK-NEXT: <<<NULL>>>
304  // CHECK-NEXT: <<<NULL>>>
305  // CHECK-NEXT: ImplicitCastExpr
306  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
307  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:13, col:18> '_Bool' '='
308  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:13> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
309  // CHECK-NEXT: ImplicitCastExpr
310  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:17, col:18> 'int' prefix '!' cannot overflow
311  // CHECK-NEXT: ImplicitCastExpr
312  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:18> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
313  // CHECK-NEXT: NullStmt
314
315  for (; b;)
316    ;
317  // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
318  // CHECK-NEXT: <<<NULL>>>
319  // CHECK-NEXT: <<<NULL>>>
320  // CHECK-NEXT: ImplicitCastExpr
321  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
322  // CHECK-NEXT: <<<NULL>>>
323  // CHECK-NEXT: NullStmt
324
325  for (;; b = !b)
326    ;
327  // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
328  // CHECK-NEXT: <<<NULL>>>
329  // CHECK-NEXT: <<<NULL>>>
330  // CHECK-NEXT: <<<NULL>>>
331  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-6]]:11, col:16> '_Bool' '='
332  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
333  // CHECK-NEXT: ImplicitCastExpr
334  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:15, col:16> 'int' prefix '!' cannot overflow
335  // CHECK-NEXT: ImplicitCastExpr
336  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> '_Bool' lvalue ParmVar 0x{{[^ ]*}} 'b' '_Bool'
337  // CHECK-NEXT: NullStmt
338
339  for (;;)
340    ;
341  // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
342  // CHECK-NEXT: <<<NULL>>>
343  // CHECK-NEXT: <<<NULL>>>
344  // CHECK-NEXT: <<<NULL>>>
345  // CHECK-NEXT: <<<NULL>>>
346  // CHECK-NEXT: NullStmt
347}
348
349void TestJumps(void) {
350  // goto and computed goto was tested in TestLabelsAndGoto().
351
352  while (1) {
353    continue;
354    // CHECK: ContinueStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:5>
355    break;
356    // CHECK: BreakStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:5>
357  }
358  return;
359  // CHECK: ReturnStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3>
360
361  return TestSwitch(1);
362  // CHECK: ReturnStmt 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:22>
363  // CHECK-NEXT: CallExpr 0x{{[^ ]*}} <col:10, col:22> 'void'
364}
365
366void TestMiscStmts(void) {
367  ({int a = 10; a;});
368  // CHECK: StmtExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:20> 'int'
369  // CHECK-NEXT: CompoundStmt
370  // CHECK-NEXT: DeclStmt
371  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:5, col:13> col:9 used a 'int' cinit
372  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:13> 'int' 10
373  // CHECK-NEXT: ImplicitCastExpr
374  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:17> 'int' lvalue Var 0x{{[^ ]*}} 'a' 'int'
375}
376