diff options
author | Steve Naroff <snaroff@apple.com> | 2009-02-26 15:55:06 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2009-02-26 15:55:06 +0000 |
commit | f1afaf6fe2d94ab265299853f288b676694f7554 (patch) | |
tree | 25227e9cc2563dcd8a602f0460c34dacd460d877 /lib/Sema/SemaExprObjC.cpp | |
parent | 2850784bda09416fc7e9d57f5baa36c9351c757c (diff) |
Fix http://llvm.org/bugs/show_bug.cgi?id=3544.
The code for looking up local/private method in Sema::ActOnInstanceMessage() was not handling categories properly. Sema::ActOnClassMessage() didn't have this bug.
Created a helper with the correct logic and changed both methods to use it.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65532 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprObjC.cpp')
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 7696cf0608..e3d2074c0e 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -202,6 +202,27 @@ bool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs, return anyIncompatibleArgs; } +// Helper method for ActOnClassMethod/ActOnInstanceMethod. +// Will search "local" class/category implementations for a method decl. +// Returns 0 if no method is found. +ObjCMethodDecl *Sema::LookupPrivateMethod(Selector Sel, + ObjCInterfaceDecl *ClassDecl) { + ObjCMethodDecl *Method = 0; + + if (ObjCImplementationDecl *ImpDecl = + ObjCImplementations[ClassDecl->getIdentifier()]) + Method = ImpDecl->getClassMethod(Sel); + + // Look through local category implementations associated with the class. + if (!Method) { + for (unsigned i = 0; i < ObjCCategoryImpls.size() && !Method; i++) { + if (ObjCCategoryImpls[i]->getClassInterface() == ClassDecl) + Method = ObjCCategoryImpls[i]->getClassMethod(Sel); + } + } + return Method; +} + // ActOnClassMessage - used for both unary and keyword messages. // ArgExprs is optional - if it is present, the number of expressions // is obtained from Sel.getNumArgs(). @@ -282,19 +303,9 @@ Sema::ExprResult Sema::ActOnClassMessage( Method = ClassDecl->lookupClassMethod(Sel); // If we have an implementation in scope, check "private" methods. - if (!Method) { - if (ObjCImplementationDecl *ImpDecl = - ObjCImplementations[ClassDecl->getIdentifier()]) - Method = ImpDecl->getClassMethod(Sel); - - // Look through local category implementations associated with the class. - if (!Method) { - for (unsigned i = 0; i < ObjCCategoryImpls.size() && !Method; i++) { - if (ObjCCategoryImpls[i]->getClassInterface() == ClassDecl) - Method = ObjCCategoryImpls[i]->getClassMethod(Sel); - } - } - } + if (!Method) + Method = LookupPrivateMethod(Sel, ClassDecl); + // Before we give up, check if the selector is an instance method. if (!Method) Method = ClassDecl->lookupInstanceMethod(Sel); @@ -379,12 +390,8 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, // First check the public methods in the class interface. Method = ClassDecl->lookupClassMethod(Sel); - if (!Method) { - // If we have an implementation in scope, check "private" methods. - if (ObjCImplementationDecl *ImpDecl = - ObjCImplementations[ClassDecl->getIdentifier()]) - Method = ImpDecl->getClassMethod(Sel); - } + if (!Method) + Method = LookupPrivateMethod(Sel, ClassDecl); } if (Method && DiagnoseUseOfDecl(Method, receiverLoc)) return true; |