xref: /aosp_15_r20/external/clang/test/Misc/ast-dump-decl.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump -ast-dump-filter Test %s | FileCheck -check-prefix CHECK -strict-whitespace %s
2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump %s | FileCheck -check-prefix CHECK-TU -strict-whitespace %s
3*67e74705SXin Li 
4*67e74705SXin Li int TestLocation;
5*67e74705SXin Li // CHECK: VarDecl 0x{{[^ ]*}} <{{.*}}:4:1, col:5> col:5 TestLocation
6*67e74705SXin Li 
7*67e74705SXin Li struct TestIndent {
8*67e74705SXin Li   int x;
9*67e74705SXin Li };
10*67e74705SXin Li // CHECK:      {{^}}RecordDecl{{.*TestIndent[^()]*$}}
11*67e74705SXin Li // CHECK-NEXT: {{^}}`-FieldDecl{{.*x[^()]*$}}
12*67e74705SXin Li 
13*67e74705SXin Li struct TestChildren {
14*67e74705SXin Li   int x;
15*67e74705SXin Li   struct y {
16*67e74705SXin Li     int z;
17*67e74705SXin Li   };
18*67e74705SXin Li };
19*67e74705SXin Li // CHECK:      RecordDecl{{.*}}TestChildren
20*67e74705SXin Li // CHECK-NEXT:   FieldDecl{{.*}}x
21*67e74705SXin Li // CHECK-NEXT:   RecordDecl{{.*}}y
22*67e74705SXin Li // CHECK-NEXT:     FieldDecl{{.*}}z
23*67e74705SXin Li 
24*67e74705SXin Li // CHECK-TU: TranslationUnitDecl
25*67e74705SXin Li 
testLabelDecl()26*67e74705SXin Li void testLabelDecl() {
27*67e74705SXin Li   __label__ TestLabelDecl;
28*67e74705SXin Li   TestLabelDecl: goto TestLabelDecl;
29*67e74705SXin Li }
30*67e74705SXin Li // CHECK:      LabelDecl{{.*}} TestLabelDecl
31*67e74705SXin Li 
32*67e74705SXin Li typedef int TestTypedefDecl;
33*67e74705SXin Li // CHECK:      TypedefDecl{{.*}} TestTypedefDecl 'int'
34*67e74705SXin Li 
35*67e74705SXin Li __module_private__ typedef int TestTypedefDeclPrivate;
36*67e74705SXin Li // CHECK:      TypedefDecl{{.*}} TestTypedefDeclPrivate 'int' __module_private__
37*67e74705SXin Li 
38*67e74705SXin Li enum TestEnumDecl {
39*67e74705SXin Li   testEnumDecl
40*67e74705SXin Li };
41*67e74705SXin Li // CHECK:      EnumDecl{{.*}} TestEnumDecl
42*67e74705SXin Li // CHECK-NEXT:   EnumConstantDecl{{.*}} testEnumDecl
43*67e74705SXin Li 
44*67e74705SXin Li struct TestEnumDeclAnon {
45*67e74705SXin Li   enum {
46*67e74705SXin Li     testEnumDeclAnon
47*67e74705SXin Li   } e;
48*67e74705SXin Li };
49*67e74705SXin Li // CHECK:      RecordDecl{{.*}} TestEnumDeclAnon
50*67e74705SXin Li // CHECK-NEXT:   EnumDecl{{.*> .*$}}
51*67e74705SXin Li 
52*67e74705SXin Li enum TestEnumDeclForward;
53*67e74705SXin Li // CHECK:      EnumDecl{{.*}} TestEnumDeclForward
54*67e74705SXin Li 
55*67e74705SXin Li __module_private__ enum TestEnumDeclPrivate;
56*67e74705SXin Li // CHECK:      EnumDecl{{.*}} TestEnumDeclPrivate __module_private__
57*67e74705SXin Li 
58*67e74705SXin Li struct TestRecordDecl {
59*67e74705SXin Li   int i;
60*67e74705SXin Li };
61*67e74705SXin Li // CHECK:      RecordDecl{{.*}} struct TestRecordDecl
62*67e74705SXin Li // CHECK-NEXT:   FieldDecl
63*67e74705SXin Li 
64*67e74705SXin Li struct TestRecordDeclEmpty {
65*67e74705SXin Li };
66*67e74705SXin Li // CHECK:      RecordDecl{{.*}} struct TestRecordDeclEmpty
67*67e74705SXin Li 
68*67e74705SXin Li struct TestRecordDeclAnon1 {
69*67e74705SXin Li   struct {
70*67e74705SXin Li   } testRecordDeclAnon1;
71*67e74705SXin Li };
72*67e74705SXin Li // CHECK:      RecordDecl{{.*}} struct TestRecordDeclAnon1
73*67e74705SXin Li // CHECK-NEXT:   RecordDecl{{.*}} struct
74*67e74705SXin Li 
75*67e74705SXin Li struct TestRecordDeclAnon2 {
76*67e74705SXin Li   struct {
77*67e74705SXin Li   };
78*67e74705SXin Li };
79*67e74705SXin Li // CHECK:      RecordDecl{{.*}} struct TestRecordDeclAnon2
80*67e74705SXin Li // CHECK-NEXT:   RecordDecl{{.*}} struct
81*67e74705SXin Li 
82*67e74705SXin Li struct TestRecordDeclForward;
83*67e74705SXin Li // CHECK:      RecordDecl{{.*}} struct TestRecordDeclForward
84*67e74705SXin Li 
85*67e74705SXin Li __module_private__ struct TestRecordDeclPrivate;
86*67e74705SXin Li // CHECK:      RecordDecl{{.*}} struct TestRecordDeclPrivate __module_private__
87*67e74705SXin Li 
88*67e74705SXin Li enum testEnumConstantDecl {
89*67e74705SXin Li   TestEnumConstantDecl,
90*67e74705SXin Li   TestEnumConstantDeclInit = 1
91*67e74705SXin Li };
92*67e74705SXin Li // CHECK:      EnumConstantDecl{{.*}} TestEnumConstantDecl 'int'
93*67e74705SXin Li // CHECK:      EnumConstantDecl{{.*}} TestEnumConstantDeclInit 'int'
94*67e74705SXin Li // CHECK-NEXT:   IntegerLiteral
95*67e74705SXin Li 
96*67e74705SXin Li struct testIndirectFieldDecl {
97*67e74705SXin Li   struct {
98*67e74705SXin Li     int TestIndirectFieldDecl;
99*67e74705SXin Li   };
100*67e74705SXin Li };
101*67e74705SXin Li // CHECK:      IndirectFieldDecl{{.*}} TestIndirectFieldDecl 'int'
102*67e74705SXin Li // CHECK-NEXT:   Field{{.*}} ''
103*67e74705SXin Li // CHECK-NEXT:   Field{{.*}} 'TestIndirectFieldDecl'
104*67e74705SXin Li 
TestFunctionDecl(int x,enum{ e } y)105*67e74705SXin Li int TestFunctionDecl(int x, enum { e } y) {
106*67e74705SXin Li   return x;
107*67e74705SXin Li }
108*67e74705SXin Li // CHECK:      FunctionDecl{{.*}} TestFunctionDecl 'int (int, enum {{.*}})'
109*67e74705SXin Li // CHECK-NEXT:   EnumDecl
110*67e74705SXin Li // CHECK-NEXT:     EnumConstantDecl{{.*}} e
111*67e74705SXin Li // CHECK-NEXT:   ParmVarDecl{{.*}} x
112*67e74705SXin Li // CHECK-NEXT:   ParmVarDecl{{.*}} y
113*67e74705SXin Li // CHECK-NEXT:   CompoundStmt
114*67e74705SXin Li 
115*67e74705SXin Li int TestFunctionDeclProto(int x);
116*67e74705SXin Li // CHECK:      FunctionDecl{{.*}} TestFunctionDeclProto 'int (int)'
117*67e74705SXin Li // CHECK-NEXT:   ParmVarDecl{{.*}} x
118*67e74705SXin Li 
119*67e74705SXin Li extern int TestFunctionDeclSC();
120*67e74705SXin Li // CHECK:      FunctionDecl{{.*}} TestFunctionDeclSC 'int ()' extern
121*67e74705SXin Li 
122*67e74705SXin Li inline int TestFunctionDeclInline();
123*67e74705SXin Li // CHECK:      FunctionDecl{{.*}} TestFunctionDeclInline 'int ()' inline
124*67e74705SXin Li 
125*67e74705SXin Li struct testFieldDecl {
126*67e74705SXin Li   int TestFieldDecl;
127*67e74705SXin Li   int TestFieldDeclWidth : 1;
128*67e74705SXin Li   __module_private__ int TestFieldDeclPrivate;
129*67e74705SXin Li };
130*67e74705SXin Li // CHECK:      FieldDecl{{.*}} TestFieldDecl 'int'
131*67e74705SXin Li // CHECK:      FieldDecl{{.*}} TestFieldDeclWidth 'int'
132*67e74705SXin Li // CHECK-NEXT:   IntegerLiteral
133*67e74705SXin Li // CHECK:      FieldDecl{{.*}} TestFieldDeclPrivate 'int' __module_private__
134*67e74705SXin Li 
135*67e74705SXin Li int TestVarDecl;
136*67e74705SXin Li // CHECK:      VarDecl{{.*}} TestVarDecl 'int'
137*67e74705SXin Li 
138*67e74705SXin Li extern int TestVarDeclSC;
139*67e74705SXin Li // CHECK:      VarDecl{{.*}} TestVarDeclSC 'int' extern
140*67e74705SXin Li 
141*67e74705SXin Li __thread int TestVarDeclThread;
142*67e74705SXin Li // CHECK:      VarDecl{{.*}} TestVarDeclThread 'int' tls{{$}}
143*67e74705SXin Li 
144*67e74705SXin Li __module_private__ int TestVarDeclPrivate;
145*67e74705SXin Li // CHECK:      VarDecl{{.*}} TestVarDeclPrivate 'int' __module_private__
146*67e74705SXin Li 
147*67e74705SXin Li int TestVarDeclInit = 0;
148*67e74705SXin Li // CHECK:      VarDecl{{.*}} TestVarDeclInit 'int'
149*67e74705SXin Li // CHECK-NEXT:   IntegerLiteral
150*67e74705SXin Li 
151*67e74705SXin Li void testParmVarDecl(int TestParmVarDecl);
152*67e74705SXin Li // CHECK: ParmVarDecl{{.*}} TestParmVarDecl 'int'
153