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