Clang Project

clang_source_code/test/AST/ast-dump-stmt.cpp
1// RUN: %clang_cc1 -std=c++2a -triple x86_64-linux-gnu -fcxx-exceptions -ast-dump %s | FileCheck -strict-whitespace %s
2
3namespace n {
4void function() {}
5int Variable;
6}
7using n::function;
8using n::Variable;
9void TestFunction() {
10  void (*f)() = &function;
11// CHECK:       DeclRefExpr{{.*}} (UsingShadow{{.*}}function
12  Variable = 4;
13// CHECK:       DeclRefExpr{{.*}} (UsingShadow{{.*}}Variable
14}
15
16// CHECK: FunctionDecl {{.*}} TestCatch1
17void TestCatch1() {
18// CHECK:       CXXTryStmt
19// CHECK-NEXT:    CompoundStmt
20  try {
21  }
22// CHECK-NEXT:    CXXCatchStmt
23// CHECK-NEXT:      VarDecl {{.*}} x
24// CHECK-NEXT:      CompoundStmt
25  catch (int x) {
26  }
27}
28
29// CHECK: FunctionDecl {{.*}} TestCatch2
30void TestCatch2() {
31// CHECK:       CXXTryStmt
32// CHECK-NEXT:    CompoundStmt
33  try {
34  }
35// CHECK-NEXT:    CXXCatchStmt
36// CHECK-NEXT:      NULL
37// CHECK-NEXT:      CompoundStmt
38  catch (...) {
39  }
40}
41
42void TestAllocationExprs() {
43  int *p;
44  p = new int;
45  delete p;
46  p = new int[2];
47  delete[] p;
48  p = ::new int;
49  ::delete p;
50}
51// CHECK: FunctionDecl {{.*}} TestAllocationExprs
52// CHECK: CXXNewExpr {{.*}} 'int *' Function {{.*}} 'operator new'
53// CHECK: CXXDeleteExpr {{.*}} 'void' Function {{.*}} 'operator delete'
54// CHECK: CXXNewExpr {{.*}} 'int *' array Function {{.*}} 'operator new[]'
55// CHECK: CXXDeleteExpr {{.*}} 'void' array Function {{.*}} 'operator delete[]'
56// CHECK: CXXNewExpr {{.*}} 'int *' global Function {{.*}} 'operator new'
57// CHECK: CXXDeleteExpr {{.*}} 'void' global Function {{.*}} 'operator delete'
58
59// Don't crash on dependent exprs that haven't been resolved yet.
60template <typename T>
61void TestDependentAllocationExpr() {
62  T *p = new T;
63  delete p;
64}
65// CHECK: FunctionTemplateDecl {{.*}} TestDependentAllocationExpr
66// CHECK: CXXNewExpr {{.*'T \*'$}}
67// CHECK: CXXDeleteExpr {{.*'void'$}}
68
69template <typename T>
70class DependentScopeMemberExprWrapper {
71  T member;
72};
73
74template <typename T>
75void TestDependentScopeMemberExpr() {
76  DependentScopeMemberExprWrapper<T> obj;
77  obj.member = T();
78  (&obj)->member = T();
79}
80// CHECK: FunctionTemplateDecl {{.*}} TestDependentScopeMemberExpr
81// CHECK: CXXDependentScopeMemberExpr {{.*}} lvalue .member
82// CHECK: CXXDependentScopeMemberExpr {{.*}} lvalue ->member
83
84union U {
85  int i;
86  long l;
87};
88
89void TestUnionInitList()
90{
91  U us[3] = {1};
92// CHECK: VarDecl {{.+}} <col:3, col:15> col:5 us 'U [3]' cinit
93// CHECK-NEXT: `-InitListExpr {{.+}} <col:13, col:15> 'U [3]'
94// CHECK-NEXT:   |-array_filler: InitListExpr {{.+}} <col:15> 'U' field Field {{.+}} 'i' 'int'
95// CHECK-NEXT:   `-InitListExpr {{.+}} <col:14> 'U' field Field {{.+}} 'i' 'int'
96// CHECK-NEXT:     `-IntegerLiteral {{.+}} <col:14> 'int' 1
97}
98
99void TestSwitch(int i) {
100  switch (int a; i)
101    ;
102  // CHECK: SwitchStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> has_init
103  // CHECK-NEXT: DeclStmt
104  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:11, col:15> col:15 a 'int'
105  // CHECK-NEXT: ImplicitCastExpr
106  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:18> 'int' lvalue ParmVar 0x{{[^ ]*}} 'i' 'int'
107  // CHECK-NEXT: NullStmt
108}
109
110void TestIf(bool b) {
111  if (int i = 12; b)
112    ;
113  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5> has_init
114  // CHECK-NEXT: DeclStmt
115  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:7, col:15> col:11 i 'int' cinit
116  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:15> 'int' 12
117  // CHECK-NEXT: ImplicitCastExpr
118  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'bool' lvalue ParmVar 0x{{[^ ]*}} 'b' 'bool'
119  // CHECK-NEXT: NullStmt
120
121  if constexpr (sizeof(b) == 1)
122    ;
123  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
124  // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <line:[[@LINE-3]]:17, col:30> 'bool'
125  // CHECK-NEXT: BinaryOperator
126  // CHECK-NEXT: UnaryExprOrTypeTraitExpr
127  // CHECK-NEXT: ParenExpr
128  // CHECK-NEXT: DeclRefExpr
129  // CHECK-NEXT: ImplicitCastExpr
130  // CHECK-NEXT: IntegerLiteral
131  // CHECK-NEXT: NullStmt
132
133  if constexpr (sizeof(b) == 1)
134    ;
135  else
136    ;
137  // CHECK: IfStmt 0x{{[^ ]*}} <line:[[@LINE-4]]:3, line:[[@LINE-1]]:5> has_else
138  // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <line:[[@LINE-5]]:17, col:30> 'bool'
139  // CHECK-NEXT: BinaryOperator
140  // CHECK-NEXT: UnaryExprOrTypeTraitExpr
141  // CHECK-NEXT: ParenExpr
142  // CHECK-NEXT: DeclRefExpr
143  // CHECK-NEXT: ImplicitCastExpr
144  // CHECK-NEXT: IntegerLiteral
145  // CHECK-NEXT: NullStmt
146  // CHECK-NEXT: NullStmt
147}
148
149struct Container {
150  int *begin() const;
151  int *end() const;
152};
153
154void TestIteration() {
155  for (int i = 0; int j = i; ++i)
156    ;
157  // CHECK: ForStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
158  // CHECK-NEXT: DeclStmt
159  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:8, col:16> col:12 used i 'int' cinit
160  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'int' 0
161  // CHECK-NEXT: DeclStmt
162  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:19, col:27> col:23 used j 'int' cinit
163  // CHECK-NEXT: ImplicitCastExpr
164  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:27> 'int' lvalue Var 0x{{[^ ]*}} 'i' 'int'
165  // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:23> 'bool' <IntegralToBoolean>
166  // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:23> 'int' <LValueToRValue>
167  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'j' 'int'
168  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:30, col:32> 'int' lvalue prefix '++'
169  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:32> 'int' lvalue Var 0x{{[^ ]*}} 'i' 'int'
170  // CHECK-NEXT: NullStmt
171
172  int vals[10];
173  for (int v : vals)
174    ;
175  // CHECK: CXXForRangeStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
176  // CHECK-NEXT: <<<NULL>>>
177  // CHECK-NEXT: DeclStmt
178  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:16> col:16 implicit used __range1 'int (&)[10]' cinit
179  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int [10]' lvalue Var 0x{{[^ ]*}} 'vals' 'int [10]'
180  // CHECK-NEXT: DeclStmt
181  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:14> col:14 implicit used __begin1 'int *':'int *' cinit
182  // CHECK-NEXT: ImplicitCastExpr
183  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int [10]' lvalue Var 0x{{[^ ]*}} '__range1' 'int (&)[10]'
184  // CHECK-NEXT: DeclStmt
185  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:14, col:16> col:14 implicit used __end1 'int *':'int *' cinit
186  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:14, col:16> 'int *' '+'
187  // CHECK-NEXT: ImplicitCastExpr
188  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int [10]' lvalue Var 0x{{[^ ]*}} '__range1' 'int (&)[10]'
189  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'long' 10
190  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:14> 'bool' '!='
191  // CHECK-NEXT: ImplicitCastExpr
192  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
193  // CHECK-NEXT: ImplicitCastExpr
194  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__end1' 'int *':'int *'
195  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue prefix '++'
196  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
197  // CHECK-NEXT: DeclStmt
198  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:8, col:14> col:12 v 'int' cinit
199  // CHECK-NEXT: ImplicitCastExpr
200  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:14> 'int' lvalue prefix '*' cannot overflow
201  // CHECK-NEXT: ImplicitCastExpr
202  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
203  // CHECK-NEXT: NullStmt
204
205  Container C;
206  for (int v : C)
207    ;
208  // CHECK: CXXForRangeStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
209  // CHECK-NEXT: <<<NULL>>>
210  // CHECK-NEXT: DeclStmt
211  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:16> col:16 implicit used __range1 'Container &' cinit
212  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'Container' lvalue Var 0x{{[^ ]*}} 'C' 'Container'
213  // CHECK-NEXT: DeclStmt
214  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:14> col:14 implicit used __begin1 'int *':'int *' cinit
215  // CHECK-NEXT: CXXMemberCallExpr 0x{{[^ ]*}} <col:14> 'int *'
216  // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:14> '<bound member function type>' .begin 0x{{[^ ]*}}
217  // CHECK-NEXT: ImplicitCastExpr
218  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'Container' lvalue Var 0x{{[^ ]*}} '__range1' 'Container &'
219  // CHECK-NEXT: DeclStmt
220  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:14> col:14 implicit used __end1 'int *':'int *' cinit
221  // CHECK-NEXT: CXXMemberCallExpr 0x{{[^ ]*}} <col:14> 'int *'
222  // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:14> '<bound member function type>' .end 0x{{[^ ]*}}
223  // CHECK-NEXT: ImplicitCastExpr
224  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'Container' lvalue Var 0x{{[^ ]*}} '__range1' 'Container &'
225  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:14> 'bool' '!='
226  // CHECK-NEXT: ImplicitCastExpr
227  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
228  // CHECK-NEXT: ImplicitCastExpr
229  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__end1' 'int *':'int *'
230  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue prefix '++'
231  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
232  // CHECK-NEXT: DeclStmt
233  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:8, col:14> col:12 v 'int' cinit
234  // CHECK-NEXT: ImplicitCastExpr
235  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:14> 'int' lvalue prefix '*' cannot overflow
236  // CHECK-NEXT: ImplicitCastExpr
237  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
238  // CHECK-NEXT: NullStmt
239
240  for (int a; int v : vals)
241    ;
242  // CHECK: CXXForRangeStmt 0x{{[^ ]*}} <line:[[@LINE-2]]:3, line:[[@LINE-1]]:5>
243  // CHECK-NEXT: DeclStmt
244  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:8, col:12> col:12 a 'int'
245  // CHECK-NEXT: DeclStmt
246  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:23> col:23 implicit used __range1 'int (&)[10]' cinit
247  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int [10]' lvalue Var 0x{{[^ ]*}} 'vals' 'int [10]'
248  // CHECK-NEXT: DeclStmt
249  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:21> col:21 implicit used __begin1 'int *':'int *' cinit
250  // CHECK-NEXT: ImplicitCastExpr
251  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:21> 'int [10]' lvalue Var 0x{{[^ ]*}} '__range1' 'int (&)[10]'
252  // CHECK-NEXT: DeclStmt
253  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:21, col:23> col:21 implicit used __end1 'int *':'int *' cinit
254  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:21, col:23> 'int *' '+'
255  // CHECK-NEXT: ImplicitCastExpr
256  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:21> 'int [10]' lvalue Var 0x{{[^ ]*}} '__range1' 'int (&)[10]'
257  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:23> 'long' 10
258  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:21> 'bool' '!='
259  // CHECK-NEXT: ImplicitCastExpr
260  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:21> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
261  // CHECK-NEXT: ImplicitCastExpr
262  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:21> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__end1' 'int *':'int *'
263  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:21> 'int *':'int *' lvalue prefix '++'
264  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:21> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
265  // CHECK-NEXT: DeclStmt
266  // CHECK-NEXT: VarDecl 0x{{[^ ]*}} <col:15, col:21> col:19 v 'int' cinit
267  // CHECK-NEXT: ImplicitCastExpr
268  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:21> 'int' lvalue prefix '*' cannot overflow
269  // CHECK-NEXT: ImplicitCastExpr
270  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:21> 'int *':'int *' lvalue Var 0x{{[^ ]*}} '__begin1' 'int *':'int *'
271  // CHECK-NEXT: NullStmt
272}
273