From a2c91e75c944e3599fb108db600f91c47c8b4342 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 18 Apr 2012 19:13:23 +0000 Subject: objective-c: Issue diagnostic when an implicit property accessor (getter) missing, instead of crashing. // rdar://11273060 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155036 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaPseudoObject.cpp | 23 ++++++++++++++++++++--- test/SemaObjC/error-implicit-property.m | 30 ++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 test/SemaObjC/error-implicit-property.m diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp index 3a54876771..0e6632964a 100644 --- a/lib/Sema/SemaPseudoObject.cpp +++ b/lib/Sema/SemaPseudoObject.cpp @@ -214,6 +214,7 @@ namespace { ObjCMethodDecl *Setter; Selector SetterSelector; + Selector GetterSelector; public: ObjCPropertyOpBuilder(Sema &S, ObjCPropertyRefExpr *refExpr) : @@ -475,8 +476,24 @@ bool ObjCPropertyOpBuilder::findGetter() { // 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 @@ ObjCPropertyOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc, assert(RefExpr->isImplicitProperty()); S.Diag(opcLoc, diag::err_nogetter_property_incdec) << unsigned(UnaryOperator::isDecrementOp(opcode)) - << RefExpr->getImplicitPropertyGetter()->getSelector() // FIXME! + << GetterSelector << op->getSourceRange(); return ExprError(); } diff --git a/test/SemaObjC/error-implicit-property.m b/test/SemaObjC/error-implicit-property.m new file mode 100644 index 0000000000..ea0587a744 --- /dev/null +++ b/test/SemaObjC/error-implicit-property.m @@ -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}} +} +- (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 -- cgit v1.2.3