// 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' // CHECK-NEXT: ParmVarDecl{{.*}} i 'int' // CHECK-NEXT: ... @end @implementation testObjCMethodDecl - (int) TestObjCMethodDecl: (int)i, ... { return 0; } // CHECK: ObjCMethodDecl{{.*}} - TestObjCMethodDecl: 'int' // CHECK-NEXT: ImplicitParamDecl{{.*}} self // CHECK-NEXT: ImplicitParamDecl{{.*}} _cmd // CHECK-NEXT: ParmVarDecl{{.*}} i 'int' // CHECK-NEXT: ... // CHECK-NEXT: CompoundStmt @end @protocol TestObjCProtocolDecl - (void) foo; @end // CHECK: ObjCProtocolDecl{{.*}} TestObjCProtocolDecl // CHECK-NEXT: ObjCMethodDecl{{.*}} foo @interface TestObjCClass : A

- (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)

- (void) bar; @end // CHECK: ObjCCategoryDecl{{.*}} TestObjCCategoryDecl // CHECK-NEXT: ObjCInterface{{.*}} 'TestObjCClass' // CHECK-NEXT: ObjCCategoryImpl{{.*}} 'TestObjCClass' // CHECK-NEXT: ObjCProtocol{{.*}} 'P' // CHECK-NEXT: ObjCMethodDecl{{.*}} bar @implementation TestObjCClass (TestObjCCategoryDecl) - (void) bar { } @end // CHECK: ObjCCategoryImplDecl{{.*}} TestObjCClass // 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 // CHECK-NEXT: ParmVarDecl{{.*}} y 'int' // CHECK-NEXT: ... // CHECK-NEXT: capture ParmVar{{.*}} 'x' 'int' // CHECK-NEXT: CompoundStmt