diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 14 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 5 |
2 files changed, 15 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 9cb8b98f704..4f085d2e437 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -635,14 +635,26 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc, (IFTy = PTy->getPointeeType()->getAsObjCInterfaceType())) { ObjCInterfaceDecl *IFace = IFTy->getDecl(); + // FIXME: The logic for looking up nullary and unary selectors should be + // shared with the code in ActOnInstanceMessage. + // Before we look for explicit property declarations, we check for // nullary methods (which allow '.' notation). Selector Sel = PP.getSelectorTable().getNullarySelector(&Member); - if (ObjCMethodDecl *MD = IFace->lookupInstanceMethod(Sel)) return new ObjCPropertyRefExpr(MD, MD->getResultType(), MemberLoc, BaseExpr); + // If this reference is in an @implementation, check for 'private' methods. + if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) { + if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) + if (ObjCImplementationDecl *ImpDecl = + ObjCImplementations[ClassDecl->getIdentifier()]) + if (ObjCMethodDecl *MD = ImpDecl->getInstanceMethod(Sel)) + return new ObjCPropertyRefExpr(MD, MD->getResultType(), + MemberLoc, BaseExpr); + } + // FIXME: Need to deal with setter methods that take 1 argument. E.g.: // @interface NSBundle : NSObject {} // - (NSString *)bundlePath; diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 99a7afdc1af..56a1f812b15 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -251,10 +251,9 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, // Handle messages to Class. if (receiverType == Context.getObjCClassType().getCanonicalType()) { ObjCMethodDecl *Method = 0; - if (getCurMethodDecl()) { - ObjCInterfaceDecl* ClassDecl = getCurMethodDecl()->getClassInterface(); + if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) { // If we have an implementation in scope, check "private" methods. - if (ClassDecl) + if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) if (ObjCImplementationDecl *ImpDecl = ObjCImplementations[ClassDecl->getIdentifier()]) Method = ImpDecl->getClassMethod(Sel); |