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