xref: /aosp_15_r20/external/clang/test/Misc/ast-dump-decl.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -Wno-unused -fblocks -ast-dump -ast-dump-filter Test %s | FileCheck -strict-whitespace %s
2*67e74705SXin Li
3*67e74705SXin Li@protocol P
4*67e74705SXin Li@end
5*67e74705SXin Li
6*67e74705SXin Li@interface A
7*67e74705SXin Li@end
8*67e74705SXin Li
9*67e74705SXin Li@interface TestObjCIvarDecl : A
10*67e74705SXin Li@end
11*67e74705SXin Li
12*67e74705SXin Li@implementation TestObjCIvarDecl {
13*67e74705SXin Li  int varDefault;
14*67e74705SXin Li  @private int varPrivate;
15*67e74705SXin Li  @protected int varProtected;
16*67e74705SXin Li  @public int varPublic;
17*67e74705SXin Li  @package int varPackage;
18*67e74705SXin Li}
19*67e74705SXin Li@end
20*67e74705SXin Li// CHECK:      ObjCImplementationDecl{{.*}} TestObjCIvarDecl
21*67e74705SXin Li// CHECK-NEXT:   ObjCInterface{{.*}} 'TestObjCIvarDecl'
22*67e74705SXin Li// CHECK-NEXT:   ObjCIvarDecl{{.*}} varDefault 'int' private
23*67e74705SXin Li// CHECK-NEXT:   ObjCIvarDecl{{.*}} varPrivate 'int' private
24*67e74705SXin Li// CHECK-NEXT:   ObjCIvarDecl{{.*}} varProtected 'int' protected
25*67e74705SXin Li// CHECK-NEXT:   ObjCIvarDecl{{.*}} varPublic 'int' public
26*67e74705SXin Li// CHECK-NEXT:   ObjCIvarDecl{{.*}} varPackage 'int' package
27*67e74705SXin Li
28*67e74705SXin Li@interface testObjCMethodDecl : A {
29*67e74705SXin Li}
30*67e74705SXin Li- (int) TestObjCMethodDecl: (int)i, ...;
31*67e74705SXin Li// CHECK:      ObjCMethodDecl{{.*}} - TestObjCMethodDecl: 'int'
32*67e74705SXin Li// CHECK-NEXT:   ParmVarDecl{{.*}} i 'int'
33*67e74705SXin Li// CHECK-NEXT:   ...
34*67e74705SXin Li@end
35*67e74705SXin Li
36*67e74705SXin Li@implementation testObjCMethodDecl
37*67e74705SXin Li- (int) TestObjCMethodDecl: (int)i, ... {
38*67e74705SXin Li  return 0;
39*67e74705SXin Li}
40*67e74705SXin Li// CHECK:      ObjCMethodDecl{{.*}} - TestObjCMethodDecl: 'int'
41*67e74705SXin Li// CHECK-NEXT:   ImplicitParamDecl{{.*}} self
42*67e74705SXin Li// CHECK-NEXT:   ImplicitParamDecl{{.*}} _cmd
43*67e74705SXin Li// CHECK-NEXT:   ParmVarDecl{{.*}} i 'int'
44*67e74705SXin Li// CHECK-NEXT:   ...
45*67e74705SXin Li// CHECK-NEXT:   CompoundStmt
46*67e74705SXin Li@end
47*67e74705SXin Li
48*67e74705SXin Li@protocol TestObjCProtocolDecl
49*67e74705SXin Li- (void) foo;
50*67e74705SXin Li@end
51*67e74705SXin Li// CHECK:      ObjCProtocolDecl{{.*}} TestObjCProtocolDecl
52*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} foo
53*67e74705SXin Li
54*67e74705SXin Li@interface TestObjCClass : A <P>
55*67e74705SXin Li- (void) foo;
56*67e74705SXin Li@end
57*67e74705SXin Li// CHECK:      ObjCInterfaceDecl{{.*}} TestObjCClass
58*67e74705SXin Li// CHECK-NEXT:   super ObjCInterface{{.*}} 'A'
59*67e74705SXin Li// CHECK-NEXT:   ObjCImplementation{{.*}} 'TestObjCClass'
60*67e74705SXin Li// CHECK-NEXT:   ObjCProtocol{{.*}} 'P'
61*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} foo
62*67e74705SXin Li
63*67e74705SXin Li@implementation TestObjCClass : A {
64*67e74705SXin Li  int i;
65*67e74705SXin Li}
66*67e74705SXin Li- (void) foo {
67*67e74705SXin Li}
68*67e74705SXin Li@end
69*67e74705SXin Li// CHECK:      ObjCImplementationDecl{{.*}} TestObjCClass
70*67e74705SXin Li// CHECK-NEXT:   super ObjCInterface{{.*}} 'A'
71*67e74705SXin Li// CHECK-NEXT:   ObjCInterface{{.*}} 'TestObjCClass'
72*67e74705SXin Li// CHECK-NEXT:   ObjCIvarDecl{{.*}} i
73*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} foo
74*67e74705SXin Li
75*67e74705SXin Li@interface TestObjCClass (TestObjCCategoryDecl) <P>
76*67e74705SXin Li- (void) bar;
77*67e74705SXin Li@end
78*67e74705SXin Li// CHECK:      ObjCCategoryDecl{{.*}} TestObjCCategoryDecl
79*67e74705SXin Li// CHECK-NEXT:   ObjCInterface{{.*}} 'TestObjCClass'
80*67e74705SXin Li// CHECK-NEXT:   ObjCCategoryImpl{{.*}} 'TestObjCClass'
81*67e74705SXin Li// CHECK-NEXT:   ObjCProtocol{{.*}} 'P'
82*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} bar
83*67e74705SXin Li
84*67e74705SXin Li@implementation TestObjCClass (TestObjCCategoryDecl)
85*67e74705SXin Li- (void) bar {
86*67e74705SXin Li}
87*67e74705SXin Li@end
88*67e74705SXin Li// CHECK:      ObjCCategoryImplDecl{{.*}} TestObjCClass
89*67e74705SXin Li// CHECK-NEXT:   ObjCInterface{{.*}} 'TestObjCClass'
90*67e74705SXin Li// CHECK-NEXT:   ObjCCategory{{.*}} 'TestObjCCategoryDecl'
91*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} bar
92*67e74705SXin Li
93*67e74705SXin Li@compatibility_alias TestObjCCompatibleAliasDecl A;
94*67e74705SXin Li// CHECK:      ObjCCompatibleAliasDecl{{.*}} TestObjCCompatibleAliasDecl
95*67e74705SXin Li// CHECK-NEXT:   ObjCInterface{{.*}} 'A'
96*67e74705SXin Li
97*67e74705SXin Li@interface TestObjCProperty: A
98*67e74705SXin Li@property(getter=getterFoo, setter=setterFoo:) int foo;
99*67e74705SXin Li@property int bar;
100*67e74705SXin Li@end
101*67e74705SXin Li// CHECK:      ObjCInterfaceDecl{{.*}} TestObjCProperty
102*67e74705SXin Li// CHECK:        ObjCPropertyDecl{{.*}} foo 'int' assign readwrite atomic unsafe_unretained
103*67e74705SXin Li// CHECK-NEXT:     getter ObjCMethod{{.*}} 'getterFoo'
104*67e74705SXin Li// CHECK-NEXT:     setter ObjCMethod{{.*}} 'setterFoo:'
105*67e74705SXin Li// CHECK-NEXT:   ObjCPropertyDecl{{.*}} bar 'int' assign readwrite atomic unsafe_unretained
106*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} getterFoo
107*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} setterFoo:
108*67e74705SXin Li// CHECK-NEXT:     ParmVarDecl{{.*}} foo
109*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} bar
110*67e74705SXin Li// CHECK-NEXT:   ObjCMethodDecl{{.*}} setBar:
111*67e74705SXin Li// CHECK-NEXT:     ParmVarDecl{{.*}} bar
112*67e74705SXin Li
113*67e74705SXin Li@implementation TestObjCProperty {
114*67e74705SXin Li  int i;
115*67e74705SXin Li}
116*67e74705SXin Li@synthesize foo=i;
117*67e74705SXin Li@synthesize bar;
118*67e74705SXin Li@end
119*67e74705SXin Li// CHECK:      ObjCImplementationDecl{{.*}} TestObjCProperty
120*67e74705SXin Li// CHECK:        ObjCPropertyImplDecl{{.*}} foo synthesize
121*67e74705SXin Li// CHECK-NEXT:     ObjCProperty{{.*}} 'foo'
122*67e74705SXin Li// CHECK-NEXT:     ObjCIvar{{.*}} 'i' 'int'
123*67e74705SXin Li// CHECK-NEXT:   ObjCIvarDecl{{.*}} bar 'int' synthesize private
124*67e74705SXin Li// CHECK-NEXT:   ObjCPropertyImplDecl{{.*}} bar synthesize
125*67e74705SXin Li// CHECK-NEXT:     ObjCProperty{{.*}} 'bar'
126*67e74705SXin Li// CHECK-NEXT:     ObjCIvar{{.*}} 'bar' 'int'
127*67e74705SXin Li
128*67e74705SXin Livoid TestBlockDecl(int x) {
129*67e74705SXin Li  ^(int y, ...){ x; };
130*67e74705SXin Li}
131*67e74705SXin Li// CHECK:      FunctionDecl{{.*}}TestBlockDecl
132*67e74705SXin Li// CHECK:      BlockDecl
133*67e74705SXin Li// CHECK-NEXT:   ParmVarDecl{{.*}} y 'int'
134*67e74705SXin Li// CHECK-NEXT:   ...
135*67e74705SXin Li// CHECK-NEXT:   capture ParmVar{{.*}} 'x' 'int'
136*67e74705SXin Li// CHECK-NEXT:   CompoundStmt
137*67e74705SXin Li
138*67e74705SXin Li@interface B
139*67e74705SXin Li+ (int) foo;
140*67e74705SXin Li@end
141*67e74705SXin Li
142*67e74705SXin Livoid f() {
143*67e74705SXin Li  __typeof__(B.foo) Test;
144*67e74705SXin Li}
145*67e74705SXin Li// CHECK: VarDecl{{.*}}Test 'typeof (B.foo)':'int'
146