From: Fariborz Jahanian Date: Thu, 24 May 2012 18:29:41 +0000 (+0000) Subject: objective-c: Fixes a corner case and interesting bug. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=246f519a51653dfc3a1af1ac4bc31bb252c633fd;p=platform%2Fupstream%2Fllvm.git objective-c: Fixes a corner case and interesting bug. Where diagnostic about unfound property is not issued in the context where a setter is looked up in situation in which name and property name differ in their first letter case. // rdar://11363363 llvm-svn: 157407 --- diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index d3b803a..52e093c 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -1415,7 +1415,8 @@ HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, return ExprError(); // Search for a declared property first. - if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member)) { + ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member); + if (PD) { // Check whether we can reference this property. if (DiagnoseUseOfDecl(PD, MemberLoc)) return ExprError(); @@ -1483,6 +1484,10 @@ HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, SelectorTable::constructSetterName(PP.getIdentifierTable(), PP.getSelectorTable(), Member); ObjCMethodDecl *Setter = IFace->lookupInstanceMethod(SetterSel); + // Check for corner case of: @property int p; ... self.P = 0; + // setter name is synthesized "setP" but there is no property name 'P'. + if (Setter && Setter->isSynthesized() && !PD) + Setter = 0; // May be founf in property's qualified list. if (!Setter) diff --git a/clang/test/SemaObjC/property-user-setter.m b/clang/test/SemaObjC/property-user-setter.m index 7d4e544..d977d15 100644 --- a/clang/test/SemaObjC/property-user-setter.m +++ b/clang/test/SemaObjC/property-user-setter.m @@ -102,3 +102,31 @@ int main (void) { abort (); return 0; } + +// rdar://11363363 +@interface rdar11363363 +{ + id R; +} +@property (copy) id p; +@property (copy) id r; +@property (copy) id Q; +@property (copy) id t; +@property (copy) id T; +@end + +@implementation rdar11363363 +@synthesize p; +@synthesize r; +@synthesize Q; +@synthesize t, T; +- (id) Meth { + self.P = 0; // expected-error {{property 'P' not found on object of type 'rdar11363363 *'}} + self.q = 0; // expected-error {{property 'q' not found on object of type 'rdar11363363 *'}} + self.t = 0; // OK + self.T = 0; // OK + self.R = 0; // expected-error {{property 'R' not found on object of type 'rdar11363363 *'; did you mean to access ivar 'R'?}} + return self.R; // expected-error {{property 'R' not found on object of type 'rdar11363363 *'; did you mean to access ivar 'R'?}} +} +@end +