From: Ted Kremenek Date: Fri, 21 Feb 2014 22:49:04 +0000 (+0000) Subject: Add requirement that attribute 'objc_protocol_requires_explicit_implementation' can... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=78684c078ec039c4efbc26c07cec7c43692727eb;p=clang Add requirement that attribute 'objc_protocol_requires_explicit_implementation' can only be applied to protocol definitions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201899 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 62ae84595c..aaebf59d8a 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 19b7955548..88cdc756ec 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -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(S, D, Attr); break; case AttributeList::AT_ObjCExplicitProtocolImpl: - handleObjCSuppresProtocolAttr(S, D, Attr); + handleObjCSuppresProtocolAttr(S, cast(D), Attr); break; case AttributeList::AT_ObjCRequiresPropertyDefs: handleSimpleAttribute(S, D, Attr); break; diff --git a/test/SemaObjC/protocols-suppress-conformance.m b/test/SemaObjC/protocols-suppress-conformance.m index 05c0486181..406c9132a8 100644 --- a/test/SemaObjC/protocols-suppress-conformance.m +++ b/test/SemaObjC/protocols-suppress-conformance.m @@ -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; +