summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-11-17 22:29:32 +0000
committerSteve Naroff <snaroff@apple.com>2008-11-17 22:29:32 +0000
commit773cdc7c0dd3546ff083a1370b7e3712e5e286be (patch)
treeb611d4ca1217fdef6af27b2e67fd4a10dfb8a6ed /clang/lib/Sema
parentaa3d68d3014bacc23d89e02facb41e9c603ade3e (diff)
downloadbcm5719-llvm-773cdc7c0dd3546ff083a1370b7e3712e5e286be.tar.gz
bcm5719-llvm-773cdc7c0dd3546ff083a1370b7e3712e5e286be.zip
Fix <rdar://problem/6333904> [sema] message lookup on super is incorrect
Missing special lookup rule in Sema::ActOnInstanceMessage(). llvm-svn: 59467
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index bc2f7f2d6f7..f6f3202ddb0 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -278,7 +278,23 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel,
QualType ReceiverCType =
Context.getCanonicalType(RExpr->getType()).getUnqualifiedType();
-
+
+ // Handle messages to 'super'.
+ if (isa<ObjCSuperExpr>(RExpr)) {
+ ObjCMethodDecl *Method = 0;
+ if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) {
+ // If we have an interface in scope, check 'super' methods.
+ if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface())
+ if (ObjCInterfaceDecl *SuperDecl = ClassDecl->getSuperClass())
+ Method = SuperDecl->lookupInstanceMethod(Sel);
+ }
+ if (CheckMessageArgumentTypes(ArgExprs, NumArgs, Sel, Method, "-",
+ lbrac, rbrac, returnType))
+ return true;
+ return new ObjCMessageExpr(RExpr, Sel, returnType, Method, lbrac, rbrac,
+ ArgExprs, NumArgs);
+ }
+
// Handle messages to id.
if (ReceiverCType == Context.getCanonicalType(Context.getObjCIdType()) ||
ReceiverCType->getAsBlockPointerType()) {
OpenPOWER on IntegriCloud