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? > +} > +- (void) Meth1 : (J*) arg { > + arg.P++; // expected-error {{no setter method 'setP:' for increment of > property}} > + arg.P--; // expected-error {{no setter method 'setP:' for decrement of > property}} > +} > + > +- (void) Meth2 : (K*) arg { > + arg.P++; // expected-error {{property 'P' not found on object of type 'K > *'}} > + arg.P--; // expected-error {{property 'P' not found on object of type 'K > *'}} > +} > +@end > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
