[cfe-commits] r96562 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDeclAttr.cpp
Ted Kremenek
kremenek at apple.com
Wed Feb 17 19:08:59 PST 2010
Author: kremenek
Date: Wed Feb 17 21:08:58 2010
New Revision: 96562
URL: http://llvm.org/viewvc/llvm-project?rev=96562&view=rev
Log:
Change the behavior of ibaction attributes to be attached to methods, not ivars.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaDeclAttr.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=96562&r1=96561&r2=96562&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Feb 17 21:08:58 2010
@@ -846,9 +846,11 @@
// Clang-Specific Attributes
-def err_attribute_ib : Error<
- "%0 attribute can only be applied to instance variables or "
+def err_attribute_iboutlet : Error<
+ "iboutlet attribute can only be applied to instance variables or "
"properties">;
+def err_attribute_ibaction: Error<
+ "ibaction attribute can only be applied to Objective-C instance methods">;
def err_attribute_overloadable_not_function : Error<
"'overloadable' attribute can only be applied to a function">;
def err_attribute_overloadable_missing : Error<
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=96562&r1=96561&r2=96562&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Wed Feb 17 21:08:58 2010
@@ -225,29 +225,38 @@
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
}
-static void HandleIBAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void HandleIBAction(Decl *d, const AttributeList &Attr, Sema &S) {
// check the attribute arguments.
if (Attr.getNumArgs() > 0) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
- // The IBOutlet/IBAction attributes only apply to instance variables of
+ // The IBAction attributes only apply to instance methods.
+ if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(d))
+ if (MD->isInstanceMethod()) {
+ d->addAttr(::new (S.Context) IBActionAttr());
+ return;
+ }
+
+ S.Diag(Attr.getLoc(), diag::err_attribute_ibaction) << Attr.getName();
+}
+
+static void HandleIBOutlet(Decl *d, const AttributeList &Attr, Sema &S) {
+ // check the attribute arguments.
+ if (Attr.getNumArgs() > 0) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+ return;
+ }
+
+ // The IBOutlet attributes only apply to instance variables of
// Objective-C classes.
if (isa<ObjCIvarDecl>(d) || isa<ObjCPropertyDecl>(d)) {
- switch (Attr.getKind()) {
- case AttributeList::AT_IBAction:
- d->addAttr(::new (S.Context) IBActionAttr());
- break;
- case AttributeList::AT_IBOutlet:
- d->addAttr(::new (S.Context) IBOutletAttr());
- break;
- default:
- llvm_unreachable("Invalid IB attribute");
- }
+ d->addAttr(::new (S.Context) IBOutletAttr());
+ return;
}
- else
- S.Diag(Attr.getLoc(), diag::err_attribute_ib) << Attr.getName();
+
+ S.Diag(Attr.getLoc(), diag::err_attribute_iboutlet) << Attr.getName();
}
static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
@@ -1745,8 +1754,8 @@
// FIXME: Try to deal with other __declspec attributes!
return;
switch (Attr.getKind()) {
- case AttributeList::AT_IBAction:
- case AttributeList::AT_IBOutlet: HandleIBAttr (D, Attr, S); break;
+ case AttributeList::AT_IBAction: HandleIBAction(D, Attr, S); break;
+ case AttributeList::AT_IBOutlet: HandleIBOutlet(D, Attr, S); break;
case AttributeList::AT_address_space:
case AttributeList::AT_objc_gc:
case AttributeList::AT_vector_size:
More information about the cfe-commits
mailing list