r201899 - Add requirement that attribute 'objc_protocol_requires_explicit_implementation' can only be applied to protocol definitions.
Ted Kremenek
kremenek at apple.com
Fri Feb 21 14:49:04 PST 2014
Author: kremenek
Date: Fri Feb 21 16:49:04 2014
New Revision: 201899
URL: http://llvm.org/viewvc/llvm-project?rev=201899&view=rev
Log:
Add requirement that attribute 'objc_protocol_requires_explicit_implementation' can only be applied to protocol definitions.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaDeclAttr.cpp
cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=201899&r1=201898&r2=201899&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Feb 21 16:49:04 2014
@@ -2499,7 +2499,10 @@ def err_objc_bridged_related_invalid_cla
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<
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=201899&r1=201898&r2=201899&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Feb 21 16:49:04 2014
@@ -1643,8 +1643,14 @@ static void handleAttrWithMessage(Sema &
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
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;
Modified: cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m?rev=201899&r1=201898&r2=201899&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m (original)
+++ cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m Fri Feb 21 16:49:04 2014
@@ -141,3 +141,6 @@ __attribute__((objc_protocol_requires_ex
- (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}}
+ at protocol NotDefined;
+
More information about the cfe-commits
mailing list