On Apr 18, 2012, at 12:35 PM, David Blaikie wrote: > On Wed, Apr 18, 2012 at 12:13 PM, Fariborz Jahanian <[email protected]> > wrote: >> Author: fjahanian >> Date: Wed Apr 18 14:13:23 2012 >> New Revision: 155036 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=155036&view=rev >> Log: >> objective-c: Issue diagnostic when an implicit >> property accessor (getter) missing, instead of crashing. >> // rdar://11273060 > > Nice - thanks! > >> Added: >> cfe/trunk/test/SemaObjC/error-implicit-property.m >> Modified: >> cfe/trunk/lib/Sema/SemaPseudoObject.cpp >> >> Modified: cfe/trunk/lib/Sema/SemaPseudoObject.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaPseudoObject.cpp?rev=155036&r1=155035&r2=155036&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaPseudoObject.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaPseudoObject.cpp Wed Apr 18 14:13:23 2012 >> @@ -214,6 +214,7 @@ >> >> ObjCMethodDecl *Setter; >> Selector SetterSelector; >> + Selector GetterSelector; >> >> public: >> ObjCPropertyOpBuilder(Sema &S, ObjCPropertyRefExpr *refExpr) : >> @@ -475,8 +476,24 @@ >> >> // For implicit properties, just trust the lookup we already did. >> if (RefExpr->isImplicitProperty()) { >> - Getter = RefExpr->getImplicitPropertyGetter(); >> - return (Getter != 0); >> + if ((Getter = RefExpr->getImplicitPropertyGetter())) { >> + GetterSelector = Getter->getSelector(); >> + return true; >> + } >> + else { >> + // Must build the getter selector the hard way. >> + ObjCMethodDecl *setter = RefExpr->getImplicitPropertySetter(); >> + assert(setter && "both setter and getter are null - cannot happen"); >> + IdentifierInfo *setterName = >> + setter->getSelector().getIdentifierInfoForSlot(0); >> + const char *compStr = setterName->getNameStart(); >> + compStr += 3; >> + IdentifierInfo *getterName = &S.Context.Idents.get(compStr); >> + GetterSelector = >> + S.PP.getSelectorTable().getNullarySelector(getterName); >> + return false; >> + >> + } >> } >> >> ObjCPropertyDecl *prop = RefExpr->getExplicitProperty(); >> @@ -776,7 +793,7 @@ >> assert(RefExpr->isImplicitProperty()); >> S.Diag(opcLoc, diag::err_nogetter_property_incdec) >> << unsigned(UnaryOperator::isDecrementOp(opcode)) >> - << RefExpr->getImplicitPropertyGetter()->getSelector() // FIXME! >> + << GetterSelector >> << op->getSourceRange(); >> return ExprError(); >> } >> >> Added: cfe/trunk/test/SemaObjC/error-implicit-property.m >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/error-implicit-property.m?rev=155036&view=auto >> ============================================================================== >> --- cfe/trunk/test/SemaObjC/error-implicit-property.m (added) >> +++ cfe/trunk/test/SemaObjC/error-implicit-property.m Wed Apr 18 14:13:23 >> 2012 >> @@ -0,0 +1,30 @@ >> +// RUN: %clang_cc1 -verify %s >> +// rdar://11273060 >> + >> +@interface I >> +- (void) setP : (int)arg; >> +@end >> + >> +@interface J >> + - (int) P; >> +@end >> + >> +@interface K @end >> + >> +@interface II @end >> + >> +@implementation II >> +- (void) Meth : (I*) arg { >> + arg.P++; // expected-error {{no getter method 'P' for increment of >> property}} >> + --arg.P; // expected-error {{no getter method 'P' for decrement of >> property}} > > Just out of curiosity - is there a reason that this particular line, > out of all six cases, uses the prefix form rather than the postfix?
No particular reason. I just wrote it that way. - Fariborz _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
