diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 9cb8b98f7043..4f085d2e4371 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 99a7afdc1af3..56a1f812b15b 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); diff --git a/clang/test/Sema/objc-property-9-impl-method.m b/clang/test/Sema/objc-property-9-impl-method.m new file mode 100644 index 000000000000..bb13d01b74ac --- /dev/null +++ b/clang/test/Sema/objc-property-9-impl-method.m @@ -0,0 +1,63 @@ +// RUN: clang %s -fsyntax-only -verify +// rdar://5967199 + +typedef signed char BOOL; +@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; + +@protocol NSObject +- (BOOL) isEqual:(id) object; +@end + +@protocol NSCoding +- (void) encodeWithCoder:(NSCoder *) aCoder; +@end + +@interface NSObject < NSObject > {} +@end + +typedef float CGFloat; +typedef struct _NSPoint {} NSSize; +typedef struct _NSRect {} NSRect; +typedef enum { NSMinXEdge = 0, NSMinYEdge = 1, NSMaxXEdge = 2, NSMaxYEdge = 3} NSRectEdge; +extern void NSDivideRect(NSRect inRect, NSRect * slice, NSRect * rem, CGFloat amount, NSRectEdge edge); + +@interface NSResponder:NSObject < NSCoding > {} +@end + +@protocol NSAnimatablePropertyContainer +- (id) animator; +@end + +extern NSString *NSAnimationTriggerOrderIn; + +@interface NSView:NSResponder < NSAnimatablePropertyContainer > {} +-(NSRect) bounds; +@end + +enum { + NSBackgroundStyleLight = 0, NSBackgroundStyleDark, NSBackgroundStyleRaised, NSBackgroundStyleLowered +}; + +@interface NSTabView:NSView {} +@end + +@ class OrganizerTabHeader; + +@interface OrganizerTabView:NSTabView {} +@property(assign) +NSSize minimumSize; +@end + +@interface OrganizerTabView() +@property(readonly) OrganizerTabHeader *tabHeaderView; +@property(readonly) NSRect headerRect; +@end + +@implementation OrganizerTabView +@dynamic tabHeaderView, headerRect, minimumSize; +-(CGFloat) tabAreaThickness {} +-(NSRectEdge) rectEdgeForTabs { + NSRect dummy, result = {}; + NSDivideRect(self.bounds, &result, &dummy, self.tabAreaThickness, self.rectEdgeForTabs); +} +