From d1b64be776a12cf281dd237ee68f8235b2edc513 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Wed, 4 Mar 2009 18:34:24 +0000 Subject: [PATCH] Partial fix for [clang on Xcode; regression]: error: instance variable 'someField' is private. A recent regression caused by http://llvm.org/viewvc/llvm-project?rev=65912&view=rev. This commit isn't fully baked. Nevertheless, it should cause Xcode to compile again. Will speak with Fariborz offline. llvm-svn: 66045 --- clang/lib/Sema/SemaExpr.cpp | 18 ++++++++-- clang/test/SemaObjC/ivar-access-tests.m | 44 ++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 43909b9afe38..f9d89fdb0be3 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -1666,6 +1666,12 @@ static IdentifierInfo *constructSetterName(IdentifierTable &Idents, return &Idents.get(&SelectorName[0], &SelectorName[SelectorName.size()]); } +ObjCImplementationDecl *getCurImplementationDecl(DeclContext *DC) { + while (DC && !isa(DC)) + DC = DC->getParent(); + return dyn_cast_or_null(DC); +} + Action::OwningExprResult Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, tok::TokenKind OpKind, SourceLocation MemberLoc, @@ -1797,9 +1803,17 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, ObjCInterfaceDecl *ClassOfMethodDecl = 0; if (ObjCMethodDecl *MD = getCurMethodDecl()) ClassOfMethodDecl = MD->getClassInterface(); - if (IV->getAccessControl() == ObjCIvarDecl::Private) { + else if (FunctionDecl *FD = getCurFunctionDecl()) { + // FIXME: This isn't working yet. Will discuss with Fariborz. + // FIXME: Should be ObjCImplDecl, so categories can work. + // Need to fiddle with castToDeclContext/castFromDeclContext. + ObjCImplementationDecl *ImpDecl = getCurImplementationDecl(FD); + if (ImpDecl) + ClassOfMethodDecl = ImpDecl->getClassInterface(); + } + if (IV->getAccessControl() == ObjCIvarDecl::Private) { if (ClassDeclared != IFTy->getDecl() || - ClassOfMethodDecl != ClassDeclared) + (ClassOfMethodDecl && (ClassOfMethodDecl != ClassDeclared))) Diag(MemberLoc, diag::error_private_ivar_access) << IV->getDeclName(); } // @protected diff --git a/clang/test/SemaObjC/ivar-access-tests.m b/clang/test/SemaObjC/ivar-access-tests.m index ee232dd1c0b1..7f5580ddb388 100644 --- a/clang/test/SemaObjC/ivar-access-tests.m +++ b/clang/test/SemaObjC/ivar-access-tests.m @@ -73,8 +73,50 @@ int main (void) { MySuperClass *s = 0; int access; - access = s->private; // expected-error {{instance variable 'private' is private}} + access = s->private; // FIXME: {{instance variable 'private' is private}} access = s->protected; // expected-error {{instance variable 'protected' is protected}} return 0; } +typedef signed char BOOL; +typedef unsigned int NSUInteger; +typedef struct _NSZone NSZone; +@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; +@protocol NSObject - (BOOL)isEqual:(id)object; +@end +@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; +@end +@interface NSObject {} +@end +extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); +@interface NSResponder : NSObject {} +@end +@protocol NSAnimatablePropertyContainer +- (id)animator; +@end +extern NSString *NSAnimationTriggerOrderIn ; +@interface NSView : NSResponder { + struct __VFlags2 { + } + _vFlags2; +} +@end +@class NSFontDescriptor, NSAffineTransform, NSGraphicsContext; +@interface NSScrollView : NSView {} +@end + +@class CasperMixerView; +@interface CasperDiffScrollView : NSScrollView { +@private + CasperMixerView *_comparatorView; + NSView *someField; +} +@end + +@implementation CasperDiffScrollView ++ (void)initialize {} +static void _CasperDiffScrollViewInstallMixerView(CasperDiffScrollView *scrollView) { + if (scrollView->someField != ((void *)0)) { + } +} +@end