Author: arphaman Date: Thu Mar 23 06:44:25 2017 New Revision: 298589 URL: http://llvm.org/viewvc/llvm-project?rev=298589&view=rev Log: Support attributes for Objective-C categories
rdar://31095315 Differential Revision: https://reviews.llvm.org/D31179 Added: cfe/trunk/test/SemaObjC/category-attribute.m Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Parse/ParseObjc.cpp cfe/trunk/lib/Sema/SemaDeclObjC.cpp cfe/trunk/test/SemaObjC/attr-deprecated.m cfe/trunk/test/SemaObjC/default-synthesize-3.m cfe/trunk/test/SemaObjC/warn-deprecated-implementations.m Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=298589&r1=298588&r2=298589&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Thu Mar 23 06:44:25 2017 @@ -364,8 +364,6 @@ def ext_decomp_decl_empty : ExtWarn< /// Objective-C parser diagnostics def err_expected_minus_or_plus : Error< "method type specifier must start with '-' or '+'">; -def err_objc_no_attributes_on_category : Error< - "attributes may not be specified on a category">; def err_objc_missing_end : Error<"missing '@end'">; def note_objc_container_start : Note< "%select{class|protocol|category|class extension|implementation" Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=298589&r1=298588&r2=298589&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Thu Mar 23 06:44:25 2017 @@ -7666,7 +7666,8 @@ public: Decl * const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs, - SourceLocation EndProtoLoc); + SourceLocation EndProtoLoc, + AttributeList *AttrList); Decl *ActOnStartClassImplementation( SourceLocation AtClassImplLoc, Modified: cfe/trunk/lib/Parse/ParseObjc.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=298589&r1=298588&r2=298589&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseObjc.cpp (original) +++ cfe/trunk/lib/Parse/ParseObjc.cpp Thu Mar 23 06:44:25 2017 @@ -278,11 +278,6 @@ Decl *Parser::ParseObjCAtInterfaceDeclar T.consumeClose(); if (T.getCloseLocation().isInvalid()) return nullptr; - - if (!attrs.empty()) { // categories don't support attributes. - Diag(nameLoc, diag::err_objc_no_attributes_on_category); - attrs.clear(); - } // Next, we need to check for any protocol references. assert(LAngleLoc.isInvalid() && "Cannot have already parsed protocols"); @@ -294,16 +289,11 @@ Decl *Parser::ParseObjCAtInterfaceDeclar /*consumeLastToken=*/true)) return nullptr; - Decl *CategoryType = - Actions.ActOnStartCategoryInterface(AtLoc, - nameId, nameLoc, - typeParameterList, - categoryId, categoryLoc, - ProtocolRefs.data(), - ProtocolRefs.size(), - ProtocolLocs.data(), - EndProtoLoc); - + Decl *CategoryType = Actions.ActOnStartCategoryInterface( + AtLoc, nameId, nameLoc, typeParameterList, categoryId, categoryLoc, + ProtocolRefs.data(), ProtocolRefs.size(), ProtocolLocs.data(), + EndProtoLoc, attrs.getList()); + if (Tok.is(tok::l_brace)) ParseObjCClassInstanceVariables(CategoryType, tok::objc_private, AtLoc); Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=298589&r1=298588&r2=298589&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Thu Mar 23 06:44:25 2017 @@ -258,7 +258,8 @@ static void DiagnoseObjCImplementedDepre S.Diag(ND->getLocation(), diag::note_method_declared_at) << ND->getDeclName(); else - S.Diag(ND->getLocation(), diag::note_previous_decl) << "class"; + S.Diag(ND->getLocation(), diag::note_previous_decl) + << (isa<ObjCCategoryDecl>(ND) ? "category" : "class"); } } @@ -1724,7 +1725,8 @@ ActOnStartCategoryInterface(SourceLocati Decl * const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs, - SourceLocation EndProtoLoc) { + SourceLocation EndProtoLoc, + AttributeList *AttrList) { ObjCCategoryDecl *CDecl; ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName, ClassLoc, true); @@ -1801,6 +1803,9 @@ ActOnStartCategoryInterface(SourceLocati NumProtoRefs, Context); } + if (AttrList) + ProcessDeclAttributeList(TUScope, CDecl, AttrList); + CheckObjCDeclScope(CDecl); return ActOnObjCContainerStartDefinition(CDecl); } @@ -1865,9 +1870,10 @@ Decl *Sema::ActOnStartCategoryImplementa CatIDecl->setImplementation(CDecl); // Warn on implementating category of deprecated class under // -Wdeprecated-implementations flag. - DiagnoseObjCImplementedDeprecations(*this, - dyn_cast<NamedDecl>(IDecl), - CDecl->getLocation(), 2); + DiagnoseObjCImplementedDeprecations( + *this, + CatIDecl->isDeprecated() ? CatIDecl : dyn_cast<NamedDecl>(IDecl), + CDecl->getLocation(), 2); } } Modified: cfe/trunk/test/SemaObjC/attr-deprecated.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-deprecated.m?rev=298589&r1=298588&r2=298589&view=diff ============================================================================== --- cfe/trunk/test/SemaObjC/attr-deprecated.m (original) +++ cfe/trunk/test/SemaObjC/attr-deprecated.m Thu Mar 23 06:44:25 2017 @@ -121,9 +121,15 @@ void test(Test2 *foo) { } __attribute__((deprecated)) -@interface A(Blah) // expected-error{{attributes may not be specified on a category}} +@interface A(Blah) // no warning +- (A*)getA; @end +@implementation A(Blah) // Don't warn by default +- (A*)getA { + return self; +} +@end typedef struct { int x; Added: cfe/trunk/test/SemaObjC/category-attribute.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/category-attribute.m?rev=298589&view=auto ============================================================================== --- cfe/trunk/test/SemaObjC/category-attribute.m (added) +++ cfe/trunk/test/SemaObjC/category-attribute.m Thu Mar 23 06:44:25 2017 @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -ast-dump %s | FileCheck %s +// expected-no-diagnostics + +__attribute__ ((external_source_symbol(language= "Swift", defined_in="A"))) +@interface TestInterface +@end +// CHECK: ObjCInterfaceDecl {{.*}} TestInterface +// CHECK-NEXT: ExternalSourceSymbolAttr + +__attribute__ ((external_source_symbol(language= "Swift", defined_in="B"))) +@interface TestInterface () +@end +// CHECK: ObjCCategoryDecl +// CHECK-NEXT: ObjCInterface +// CHECK-NEXT: ExternalSourceSymbolAttr {{.*}} "Swift" "B" + +__attribute__ ((external_source_symbol(language= "Swift", defined_in="C"))) +@interface TestInterface (Category) +@end +// CHECK: ObjCCategoryDecl +// CHECK-NEXT: ObjCInterface +// CHECK-NEXT: ExternalSourceSymbolAttr {{.*}} "Swift" "C" Modified: cfe/trunk/test/SemaObjC/default-synthesize-3.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/default-synthesize-3.m?rev=298589&r1=298588&r2=298589&view=diff ============================================================================== --- cfe/trunk/test/SemaObjC/default-synthesize-3.m (original) +++ cfe/trunk/test/SemaObjC/default-synthesize-3.m Thu Mar 23 06:44:25 2017 @@ -33,8 +33,8 @@ __attribute ((objc_requires_property_def - (id) DeepMustSynthProperty { return 0; } @end -__attribute ((objc_requires_property_definitions)) -@interface Deep(CAT) // expected-error {{attributes may not be specified on a category}} +__attribute ((objc_requires_property_definitions)) // expected-error {{'objc_requires_property_definitions' attribute only applies to Objective-C interfaces}} +@interface Deep(CAT) @end __attribute ((objc_requires_property_definitions)) // expected-error {{'objc_requires_property_definitions' attribute only applies to Objective-C interfaces}} Modified: cfe/trunk/test/SemaObjC/warn-deprecated-implementations.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/warn-deprecated-implementations.m?rev=298589&r1=298588&r2=298589&view=diff ============================================================================== --- cfe/trunk/test/SemaObjC/warn-deprecated-implementations.m (original) +++ cfe/trunk/test/SemaObjC/warn-deprecated-implementations.m Thu Mar 23 06:44:25 2017 @@ -65,3 +65,10 @@ __attribute__((deprecated)) return (void *)0; } @end + +__attribute__((deprecated)) +@interface Test(DeprecatedCategory) // expected-note {{category declared here}} +@end + +@implementation Test(DeprecatedCategory) // expected-warning {{Implementing deprecated category}} +@end _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits