| // RUN: %clang_cc1 -Wno-unused -fblocks -ast-dump -ast-dump-filter Test %s | FileCheck -strict-whitespace %s |
| |
| @protocol P |
| @end |
| |
| @interface A |
| @end |
| |
| @interface TestObjCIvarDecl : A |
| @end |
| |
| @implementation TestObjCIvarDecl { |
| int varDefault; |
| @private int varPrivate; |
| @protected int varProtected; |
| @public int varPublic; |
| @package int varPackage; |
| } |
| @end |
| // CHECK: ObjCImplementationDecl{{.*}} TestObjCIvarDecl |
| // CHECK-NEXT: ObjCInterface{{.*}} 'TestObjCIvarDecl' |
| // CHECK-NEXT: ObjCIvarDecl{{.*}} varDefault 'int' private |
| // CHECK-NEXT: ObjCIvarDecl{{.*}} varPrivate 'int' private |
| // CHECK-NEXT: ObjCIvarDecl{{.*}} varProtected 'int' protected |
| // CHECK-NEXT: ObjCIvarDecl{{.*}} varPublic 'int' public |
| // CHECK-NEXT: ObjCIvarDecl{{.*}} varPackage 'int' package |
| |
| @interface testObjCMethodDecl : A { |
| } |
| - (int) TestObjCMethodDecl: (int)i, ...; |
| // CHECK: ObjCMethodDecl{{.*}} - TestObjCMethodDecl: 'int' variadic |
| // CHECK-NEXT: ParmVarDecl{{.*}} i 'int' |
| @end |
| |
| @implementation testObjCMethodDecl |
| - (int) TestObjCMethodDecl: (int)i, ... { |
| return 0; |
| } |
| // CHECK: ObjCMethodDecl{{.*}} - TestObjCMethodDecl: 'int' variadic |
| // CHECK-NEXT: ImplicitParamDecl{{.*}} self |
| // CHECK-NEXT: ImplicitParamDecl{{.*}} _cmd |
| // CHECK-NEXT: ParmVarDecl{{.*}} i 'int' |
| // CHECK-NEXT: CompoundStmt |
| @end |
| |
| @protocol TestObjCProtocolDecl |
| - (void) foo; |
| @end |
| // CHECK: ObjCProtocolDecl{{.*}} TestObjCProtocolDecl |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} foo |
| |
| @interface TestObjCClass : A <P> |
| - (void) foo; |
| @end |
| // CHECK: ObjCInterfaceDecl{{.*}} TestObjCClass |
| // CHECK-NEXT: super ObjCInterface{{.*}} 'A' |
| // CHECK-NEXT: ObjCImplementation{{.*}} 'TestObjCClass' |
| // CHECK-NEXT: ObjCProtocol{{.*}} 'P' |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} foo |
| |
| @implementation TestObjCClass : A { |
| int i; |
| } |
| - (void) foo { |
| } |
| @end |
| // CHECK: ObjCImplementationDecl{{.*}} TestObjCClass |
| // CHECK-NEXT: super ObjCInterface{{.*}} 'A' |
| // CHECK-NEXT: ObjCInterface{{.*}} 'TestObjCClass' |
| // CHECK-NEXT: ObjCIvarDecl{{.*}} i |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} foo |
| |
| @interface TestObjCClass (TestObjCCategoryDecl) <P> |
| - (void) bar; |
| @end |
| // CHECK: ObjCCategoryDecl{{.*}} TestObjCCategoryDecl |
| // CHECK-NEXT: ObjCInterface{{.*}} 'TestObjCClass' |
| // CHECK-NEXT: ObjCCategoryImpl{{.*}} 'TestObjCCategoryDecl' |
| // CHECK-NEXT: ObjCProtocol{{.*}} 'P' |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} bar |
| |
| @interface TestGenericInterface<T> : A<P> { |
| } |
| @end |
| // CHECK: ObjCInterfaceDecl{{.*}} TestGenericInterface |
| // CHECK-NEXT: -super ObjCInterface {{.+}} 'A' |
| // CHECK-NEXT: -ObjCProtocol {{.+}} 'P' |
| // CHECK-NEXT: -ObjCTypeParamDecl {{.+}} <col:33> col:33 T 'id':'id' |
| |
| @implementation TestObjCClass (TestObjCCategoryDecl) |
| - (void) bar { |
| } |
| @end |
| // CHECK: ObjCCategoryImplDecl{{.*}} TestObjCCategoryDecl |
| // CHECK-NEXT: ObjCInterface{{.*}} 'TestObjCClass' |
| // CHECK-NEXT: ObjCCategory{{.*}} 'TestObjCCategoryDecl' |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} bar |
| |
| @compatibility_alias TestObjCCompatibleAliasDecl A; |
| // CHECK: ObjCCompatibleAliasDecl{{.*}} TestObjCCompatibleAliasDecl |
| // CHECK-NEXT: ObjCInterface{{.*}} 'A' |
| |
| @interface TestObjCProperty: A |
| @property(getter=getterFoo, setter=setterFoo:) int foo; |
| @property int bar; |
| @end |
| // CHECK: ObjCInterfaceDecl{{.*}} TestObjCProperty |
| // CHECK: ObjCPropertyDecl{{.*}} foo 'int' assign readwrite atomic unsafe_unretained |
| // CHECK-NEXT: getter ObjCMethod{{.*}} 'getterFoo' |
| // CHECK-NEXT: setter ObjCMethod{{.*}} 'setterFoo:' |
| // CHECK-NEXT: ObjCPropertyDecl{{.*}} bar 'int' assign readwrite atomic unsafe_unretained |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} getterFoo |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} setterFoo: |
| // CHECK-NEXT: ParmVarDecl{{.*}} foo |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} bar |
| // CHECK-NEXT: ObjCMethodDecl{{.*}} setBar: |
| // CHECK-NEXT: ParmVarDecl{{.*}} bar |
| |
| @implementation TestObjCProperty { |
| int i; |
| } |
| @synthesize foo=i; |
| @synthesize bar; |
| @end |
| // CHECK: ObjCImplementationDecl{{.*}} TestObjCProperty |
| // CHECK: ObjCPropertyImplDecl{{.*}} foo synthesize |
| // CHECK-NEXT: ObjCProperty{{.*}} 'foo' |
| // CHECK-NEXT: ObjCIvar{{.*}} 'i' 'int' |
| // CHECK-NEXT: ObjCIvarDecl{{.*}} bar 'int' synthesize private |
| // CHECK-NEXT: ObjCPropertyImplDecl{{.*}} bar synthesize |
| // CHECK-NEXT: ObjCProperty{{.*}} 'bar' |
| // CHECK-NEXT: ObjCIvar{{.*}} 'bar' 'int' |
| |
| void TestBlockDecl(int x) { |
| ^(int y, ...){ x; }; |
| } |
| // CHECK: FunctionDecl{{.*}}TestBlockDecl |
| // CHECK: BlockDecl {{.+}} <col:3, col:21> col:3 variadic |
| // CHECK-NEXT: ParmVarDecl{{.*}} y 'int' |
| // CHECK-NEXT: capture ParmVar{{.*}} 'x' 'int' |
| // CHECK-NEXT: CompoundStmt |
| |
| @interface B |
| + (int) foo; |
| @end |
| |
| void f() { |
| __typeof__(B.foo) Test; |
| } |
| // CHECK: VarDecl{{.*}}Test 'typeof (B.foo)':'int' |