Add requirement that attribute 'objc_protocol_requires_explicit_implementation' can only be applied to protocol definitions.

llvm-svn: 201899
This commit is contained in:
Ted Kremenek 2014-02-21 22:49:04 +00:00
parent e87e0343de
commit 27cfe10df8
3 changed files with 15 additions and 3 deletions

@ -2499,7 +2499,10 @@ def err_objc_bridged_related_invalid_class_name : Error<
def err_objc_bridged_related_known_method : Error<
"%0 must be explicitly converted to %1; use %select{%objcclass2|%objcinstance2}3 "
"method for this conversion">;
def err_objc_attr_protocol_requires_definition : Error<
"attribute %0 can only be applied to @protocol definitions, not forward declarations">;
// Function Parameter Semantic Analysis.
def err_param_with_void_type : Error<"argument may not have 'void' type">;
def err_void_only_param : Error<

@ -1643,8 +1643,14 @@ static void handleAttrWithMessage(Sema &S, Decl *D,
Attr.getAttributeSpellingListIndex()));
}
static void handleObjCSuppresProtocolAttr(Sema &S, Decl *D,
static void handleObjCSuppresProtocolAttr(Sema &S, ObjCProtocolDecl *D,
const AttributeList &Attr) {
if (!D->isThisDeclarationADefinition()) {
S.Diag(Attr.getLoc(), diag::err_objc_attr_protocol_requires_definition)
<< Attr.getName() << Attr.getRange();
return;
}
D->addAttr(::new (S.Context)
ObjCExplicitProtocolImplAttr(Attr.getRange(), S.Context,
Attr.getAttributeSpellingListIndex()));
@ -4191,7 +4197,7 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
case AttributeList::AT_ObjCRootClass:
handleSimpleAttribute<ObjCRootClassAttr>(S, D, Attr); break;
case AttributeList::AT_ObjCExplicitProtocolImpl:
handleObjCSuppresProtocolAttr(S, D, Attr);
handleObjCSuppresProtocolAttr(S, cast<ObjCProtocolDecl>(D), Attr);
break;
case AttributeList::AT_ObjCRequiresPropertyDefs:
handleSimpleAttribute<ObjCRequiresPropertyDefsAttr>(S, D, Attr); break;

@ -141,3 +141,6 @@ __attribute__((objc_protocol_requires_explicit_implementation))
- (void)dunwich {}
@end
__attribute__((objc_protocol_requires_explicit_implementation)) // expected-error{{attribute 'objc_protocol_requires_explicit_implementation' can only be applied to @protocol definitions, not forward declarations}}
@protocol NotDefined;