diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2011-09-17 19:23:40 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-09-17 19:23:40 +0000 |
commit | db8015c4497a0527de48c4865edfc09403091eb9 (patch) | |
tree | 1afd66129ff70cc6eea609bea8d4713fc8bf80c4 /clang/lib/Sema/SemaExprObjC.cpp | |
parent | 8b148bb5b7d52f1aad26abec0f6c2bdd4a9f5762 (diff) | |
download | bcm5719-llvm-db8015c4497a0527de48c4865edfc09403091eb9.tar.gz bcm5719-llvm-db8015c4497a0527de48c4865edfc09403091eb9.zip |
objc - Treat type of 'self' in class methods as root of
class of this method. // rdar://10109725
llvm-svn: 139989
Diffstat (limited to 'clang/lib/Sema/SemaExprObjC.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 51b5e4fb63b..5858596205e 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -457,18 +457,20 @@ bool Sema::CheckMessageArgumentTypes(QualType ReceiverType, return IsError; } -bool Sema::isSelfExpr(Expr *receiver) { +/// GetMethodIfSelfExpr - Check if receiver is an objc 'self' expression +/// and return its method declaration if so; else return 0. +const ObjCMethodDecl *Sema::GetMethodIfSelfExpr(Expr *receiver) { // 'self' is objc 'self' in an objc method only. DeclContext *DC = CurContext; while (isa<BlockDecl>(DC)) DC = DC->getParent(); if (DC && !isa<ObjCMethodDecl>(DC)) - return false; + return 0; receiver = receiver->IgnoreParenLValueCasts(); if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(receiver)) if (DRE->getDecl()->getIdentifier() == &Context.Idents.get("self")) - return true; - return false; + return static_cast<ObjCMethodDecl*>(DC); + return 0; } // Helper method for ActOnClassMethod/ActOnInstanceMethod. @@ -1272,7 +1274,7 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, } if (!Method) { // If not messaging 'self', look for any factory method named 'Sel'. - if (!Receiver || !isSelfExpr(Receiver)) { + if (!Receiver || !GetMethodIfSelfExpr(Receiver)) { Method = LookupFactoryMethodInGlobalPool(Sel, SourceRange(LBracLoc, RBracLoc), true); @@ -1336,7 +1338,7 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, return ExprError(); } - if (!Method && (!Receiver || !isSelfExpr(Receiver))) { + if (!Method && (!Receiver || !GetMethodIfSelfExpr(Receiver))) { // If we still haven't found a method, look in the global pool. This // behavior isn't very desirable, however we need it for GCC // compatibility. FIXME: should we deviate?? @@ -1507,7 +1509,7 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, if (getLangOptions().ObjCAutoRefCount) { // In ARC, annotate delegate init calls. if (Result->getMethodFamily() == OMF_init && - (SuperLoc.isValid() || isSelfExpr(Receiver))) { + (SuperLoc.isValid() || GetMethodIfSelfExpr(Receiver))) { // Only consider init calls *directly* in init implementations, // not within blocks. ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(CurContext); |