Allow the 'ibaction' attribute to be attached to method declarations (and not issue a warning).

llvm-svn: 101699
This commit is contained in:
Ted Kremenek 2010-04-18 04:59:38 +00:00
parent a50738abba
commit 36712b2ac1
2 changed files with 27 additions and 2 deletions

View File

@ -1492,6 +1492,16 @@ CvtQTToAstBitMask(ObjCDeclSpec::ObjCDeclQualifier PQTVal) {
return ret;
}
static inline
bool containsInvalidMethodImplAttribute(const AttributeList *A) {
// The 'ibaction' attribute is allowed on method definitions because of
// how the IBAction macro is used on both method declarations and definitions.
// If the method definitions contains any other attributes, return true.
while (A && A->getKind() == AttributeList::AT_IBAction)
A = A->getNext();
return A != NULL;
}
Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
SourceLocation MethodLoc, SourceLocation EndLoc,
tok::TokenKind MethodType, DeclPtrTy classDecl,
@ -1618,7 +1628,7 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
}
InterfaceMD = ImpDecl->getClassInterface()->getMethod(Sel,
MethodType == tok::minus);
if (AttrList)
if (containsInvalidMethodImplAttribute(AttrList))
Diag(EndLoc, diag::warn_attribute_method_def);
} else if (ObjCCategoryImplDecl *CatImpDecl =
dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {
@ -1629,7 +1639,7 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
PrevMethod = CatImpDecl->getClassMethod(Sel);
CatImpDecl->addClassMethod(ObjCMethod);
}
if (AttrList)
if (containsInvalidMethodImplAttribute(AttrList))
Diag(EndLoc, diag::warn_attribute_method_def);
}
if (PrevMethod) {

View File

@ -0,0 +1,15 @@
// RUN: %clang_cc1 %s -verify
@interface Foo
{
__attribute__((iboutlet)) id myoutlet;
}
- (void) __attribute__((ibaction)) myMessage:(id)msg;
@end
@implementation Foo
// Normally attributes should not be attached to method definitions, but
// we allow 'ibaction' to be attached because it can be expanded from
// the IBAction macro.
- (void) __attribute__((ibaction)) myMessage:(id)msg {} // no-warning
@end