From: Steve Naroff Date: Fri, 7 Dec 2007 20:41:14 +0000 (+0000) Subject: Lookup methods in the global pool even when a statically typed object's class interfa... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9feba0289158b361577df39063025c43c7cc8bfb;p=clang Lookup methods in the global pool even when a statically typed object's class interface isn't in scope! As the comment in the code indicates, I'm not fond of this. Nevertheless, gcc compat is a goal. Here is the case I'm talking about... #import @interface AnyClass : NSObject - (NSRect)rect; @end @class Helicopter; static void func(Helicopter *obj) { NSRect r = [obj rect]; } ...before this patch, we would warn/error. With this patch, everything "just works". git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44682 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp index 56b792eaf5..e7102aa0a2 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -2245,6 +2245,10 @@ Sema::ExprResult Sema::ActOnInstanceMessage( if (ObjcImplementationDecl *ImpDecl = ObjcImplementations[ClassDecl->getIdentifier()]) Method = ImpDecl->lookupInstanceMethod(Sel); + // If we still haven't found a method, look in the global pool. + // I am not fond of this behavior, however we conform to what gcc does. + if (!Method) + Method = InstanceMethodPool[Sel].Method; } if (!Method) { Diag(lbrac, diag::warn_method_not_found, std::string("-"), Sel.getName(),