|  | // 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 <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 | 
|  |  | 
|  | @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 | 
|  | // CHECK-NEXT:   ParmVarDecl{{.*}} y 'int' | 
|  | // CHECK-NEXT:   ... | 
|  | // 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' |