diff options
author | Steve Naroff <snaroff@apple.com> | 2007-12-07 20:41:14 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2007-12-07 20:41:14 +0000 |
commit | 9feba0289158b361577df39063025c43c7cc8bfb (patch) | |
tree | 2cb9f37dfb00a50bde02d87ef4fc43041238d36b | |
parent | 36ee2cb3247a662b6049f9cc097ba5cf9c0bb2b5 (diff) |
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 <Foundation/Foundation.h>
@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
-rw-r--r-- | Sema/SemaExpr.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
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(), |