1// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s 2// RUN: %clang_cc1 -fsyntax-only -Wno-objc-root-class -ast-dump -ast-dump-filter test %s | FileCheck %s 3 4#pragma clang attribute push (__attribute__((annotate("test"))), apply_to = any(objc_interface, objc_protocol, objc_property, field, objc_method, variable)) 5#pragma clang attribute push (__attribute__((objc_subclassing_restricted)), apply_to = objc_interface) 6 7@interface testInterface1 8// CHECK-LABEL: ObjCInterfaceDecl{{.*}}testInterface1 9// CHECK-NEXT: ObjCImplementation 10// CHECK-NEXT: AnnotateAttr{{.*}} "test" 11// CHECK-NEXT: ObjCSubclassingRestrictedAttr{{.*}} 12 13// CHECK-NOT: AnnotateAttr 14// CHECK-NOT: ObjCSubclassingRestrictedAttr 15 16{ 17 int testIvar1; 18 // CHECK-LABEL: ObjCIvarDecl{{.*}} testIvar1 19 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 20 // CHECK-NOT: ObjCSubclassingRestrictedAttr 21} 22 23@property int testProp1; 24// CHECK-LABEL: ObjCPropertyDecl{{.*}} testProp1 25// CHECK-NEXT: AnnotateAttr{{.*}} "test" 26// CHECK-NOT: ObjCSubclassingRestrictedAttr 27 28- (void)testIm:(int) x; 29// CHECK-LABEL: ObjCMethodDecl{{.*}}testIm 30// CHECK-NEXT: ParmVarDecl{{.*}} x 31// CHECK-NEXT: AnnotateAttr{{.*}} "test" 32// CHECK-NEXT: AnnotateAttr{{.*}} "test" 33// CHECK-NOT: ObjCSubclassingRestrictedAttr 34 35+ (void)testCm; 36// CHECK-LABEL: ObjCMethodDecl{{.*}}testCm 37// CHECK-NEXT: AnnotateAttr{{.*}} "test" 38// CHECK-NOT: ObjCSubclassingRestrictedAttr 39 40// Implicit getters/setters shouldn't receive the attributes. 41// CHECK-LABEL: ObjCMethodDecl{{.*}}testProp1 42// CHECK-NOT: AnnotateAttr 43// CHECK-LABEL: ObjCMethodDecl{{.*}}setTestProp1 44// CHECK-NOT: AnnotateAttr 45 46@end 47 48// @implementation can't receive explicit attributes, so don't add the pragma 49// attributes to them. 50@implementation testInterface1 51// CHECK-LABEL: ObjCImplementationDecl{{.*}}testInterface1 52// CHECK-NOT: AnnotateAttr 53// CHECK-NOT: ObjCSubclassingRestrictedAttr 54 55{ 56 int testIvar2; 57 // CHECK-LABEL: ObjCIvarDecl{{.*}} testIvar2 58 // CHECK-NEXT: AnnotateAttr{{.*}} "test" 59 // CHECK-NOT: ObjCSubclassingRestrictedAttr 60} 61 62// Don't add attributes to implicit parameters! 63- (void)testIm:(int) x { 64// CHECK-LABEL: ObjCMethodDecl{{.*}}testIm 65// CHECK-NEXT: ImplicitParamDecl 66// CHECK-NEXT: ImplicitParamDecl 67// CHECK-NEXT: ParmVarDecl{{.*}} x 68// CHECK-NEXT: AnnotateAttr{{.*}} "test" 69// CHECK-NEXT: CompoundStmt 70// CHECK-NEXT: AnnotateAttr{{.*}} "test" 71// CHECK-NOT: ObjCSubclassingRestrictedAttr 72} 73 74+ (void)testCm { 75// CHECK-LABEL: ObjCMethodDecl{{.*}}testCm 76// CHECK: AnnotateAttr{{.*}} "test" 77// CHECK-NOT: ObjCSubclassingRestrictedAttr 78// CHECK-NOT: AnnotateAttr 79 _Pragma("clang attribute push (__attribute__((annotate(\"applied at container start\"))), apply_to=objc_interface)"); 80} 81 82// Implicit ivars shouldn't receive the attributes. 83// CHECK-LABEL: ObjCIvarDecl{{.*}}_testProp1 84// CHECK-NOT: AnnotateAttr 85 86@end 87 88@implementation testImplWithoutInterface // expected-warning {{cannot find interface declaration for 'testImplWithoutInterface'}} 89// CHECK-LABEL: ObjCInterfaceDecl{{.*}}testImplWithoutInterface 90// CHECK-NEXT: ObjCImplementation 91// CHECK-NEXT: AnnotateAttr{{.*}} "test" 92// CHECK-NEXT: ObjCSubclassingRestrictedAttr 93// CHECK-NEXT: AnnotateAttr{{.*}} "applied at container start" 94 95// CHECK-LABEL: ObjCImplementationDecl{{.*}}testImplWithoutInterface 96// CHECK-NOT: AnnotateAttr 97// CHECK-NOT: ObjCSubclassingRestrictedAttr 98 99@end 100 101#pragma clang attribute pop 102 103@protocol testProtocol 104// CHECK-LABEL: ObjCProtocolDecl{{.*}}testProtocol 105// CHECK-NEXT: AnnotateAttr{{.*}} "test" 106// CHECK-NOT: ObjCSubclassingRestrictedAttr 107// CHECK-NOT: AnnotateAttr 108 109- (void)testProtIm; 110// CHECK-LABEL: ObjCMethodDecl{{.*}}testProtIm 111// CHECK-NEXT: AnnotateAttr{{.*}} "test" 112// CHECK-NOT: ObjCSubclassingRestrictedAttr 113 114@end 115 116@protocol testForwardProtocol; 117// CHECK-LABEL: ObjCProtocolDecl{{.*}}testForwardProtocol 118// CHECK-NEXT: AnnotateAttr{{.*}} "test" 119// CHECK-NOT: ObjCSubclassingRestrictedAttr 120 121 122// Categories can't receive explicit attributes, so don't add pragma attributes 123// to them. 124@interface testInterface1(testCat) 125// CHECK-LABEL: ObjCCategoryDecl{{.*}}testCat 126// CHECK-NOT: AnnotateAttr 127// CHECK-NOT: ObjCSubclassingRestrictedAttr 128 129@end 130 131@implementation testInterface1(testCat) 132// CHECK-LABEL: ObjCCategoryImplDecl{{.*}}testCat 133// CHECK-NOT: AnnotateAttr 134// CHECK-NOT: ObjCSubclassingRestrictedAttr 135 136@end 137 138// @class/@compatibility_alias declarations can't receive explicit attributes, 139// so don't add pragma attributes to them. 140@class testClass; 141// CHECK-LABEL: ObjCInterfaceDecl{{.*}}testClass 142// CHECK-NOT: AnnotateAttr 143// CHECK-NOT: ObjCSubclassingRestrictedAttr 144 145@compatibility_alias testCompat testInterface1; 146// CHECK-LABEL: ObjCCompatibleAliasDecl{{.*}}testCompat 147// CHECK-NOT: AnnotateAttr 148// CHECK-NOT: ObjCSubclassingRestrictedAttr 149 150#pragma clang attribute pop // objc_subclassing_restricted 151 152@interface testInterface3 153// CHECK-LABEL: ObjCInterfaceDecl{{.*}}testInterface3 154// CHECK-NEXT: AnnotateAttr{{.*}} "test" 155// CHECK-NOT: ObjCSubclassingRestrictedAttr 156@end 157 158#pragma clang attribute pop // annotate("test") 159 160@interface testInterface4 161// CHECK-LABEL: ObjCInterfaceDecl{{.*}}testInterface4 162// CHECK-NOT: AnnotateAttr 163// CHECK-NOT: ObjCSubclassingRestrictedAttr 164@end 165