diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 9cb47cce4b29..f68ef92e9628 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -1768,8 +1768,9 @@ public: // Helper method for ActOnClassMethod/ActOnInstanceMethod. // Will search "local" class/category implementations for a method decl. + // Will also search in class's root looking for instance method. // Returns 0 if no method is found. - ObjCMethodDecl *LookupPrivateMethod(Selector Sel, ObjCInterfaceDecl *CDecl); + ObjCMethodDecl *LookupPrivateOrRootMethod(Selector Sel, ObjCInterfaceDecl *CDecl); // ActOnClassMessage - used for both unary and keyword messages. // ArgExprs is optional - if it is present, the number of expressions diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 80120a7b7a4a..9266e48a98e1 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -211,8 +211,9 @@ bool Sema::isSelfExpr(Expr *RExpr) { // Helper method for ActOnClassMethod/ActOnInstanceMethod. // Will search "local" class/category implementations for a method decl. +// If failed, then we search in class's root for an instance method. // Returns 0 if no method is found. -ObjCMethodDecl *Sema::LookupPrivateMethod(Selector Sel, +ObjCMethodDecl *Sema::LookupPrivateOrRootMethod(Selector Sel, ObjCInterfaceDecl *ClassDecl) { ObjCMethodDecl *Method = 0; @@ -227,6 +228,15 @@ ObjCMethodDecl *Sema::LookupPrivateMethod(Selector Sel, Method = ObjCCategoryImpls[i]->getClassMethod(Sel); } } + // Before we give up, check if the selector is an instance method. + // But only in the root. This matches gcc's behaviour and what the + // runtime expects. + if (!Method) { + ObjCInterfaceDecl *Root = ClassDecl; + while (Root->getSuperClass()) + Root = Root->getSuperClass(); + Method = Root->lookupInstanceMethod(Sel); + } return Method; } @@ -311,17 +321,7 @@ Sema::ExprResult Sema::ActOnClassMessage( // If we have an implementation in scope, check "private" methods. if (!Method) - Method = LookupPrivateMethod(Sel, ClassDecl); - - // Before we give up, check if the selector is an instance method. - // But only in the root. This matches gcc's behaviour and what the - // runtime expects. - if (!Method) { - ObjCInterfaceDecl *Root = ClassDecl; - while (Root->getSuperClass()) - Root = Root->getSuperClass(); - Method = Root->lookupInstanceMethod(Sel); - } + Method = LookupPrivateOrRootMethod(Sel, ClassDecl); if (Method && DiagnoseUseOfDecl(Method, receiverLoc)) return true; @@ -405,16 +405,7 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, Method = ClassDecl->lookupClassMethod(Sel); if (!Method) - Method = LookupPrivateMethod(Sel, ClassDecl); - // Before we give up, check if the selector is an instance method. - // But only in the root. This matches gcc's behaviour and what the - // runtime expects. - if (!Method) { - ObjCInterfaceDecl *Root = ClassDecl; - while (Root->getSuperClass()) - Root = Root->getSuperClass(); - Method = Root->lookupInstanceMethod(Sel); - } + Method = LookupPrivateOrRootMethod(Sel, ClassDecl); } if (Method && DiagnoseUseOfDecl(Method, receiverLoc)) return true;