diff options
author | Steve Naroff <snaroff@apple.com> | 2008-11-17 22:29:32 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2008-11-17 22:29:32 +0000 |
commit | 773cdc7c0dd3546ff083a1370b7e3712e5e286be (patch) | |
tree | b611d4ca1217fdef6af27b2e67fd4a10dfb8a6ed /clang/lib/Sema | |
parent | aa3d68d3014bacc23d89e02facb41e9c603ade3e (diff) | |
download | bcm5719-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.cpp | 18 |
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()) { |