diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2012-04-18 19:13:23 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-04-18 19:13:23 +0000 |
| commit | b525b52987f6fca44dfb9d55017a897c183f4e37 (patch) | |
| tree | f080f7b819af1ccc4a45eb65bba7b73c5367bc59 | |
| parent | bb73d1979409fa3354380b014cb0af6c907e9a53 (diff) | |
| download | bcm5719-llvm-b525b52987f6fca44dfb9d55017a897c183f4e37.tar.gz bcm5719-llvm-b525b52987f6fca44dfb9d55017a897c183f4e37.zip | |
objective-c: Issue diagnostic when an implicit
property accessor (getter) missing, instead of crashing.
// rdar://11273060
llvm-svn: 155036
| -rw-r--r-- | clang/lib/Sema/SemaPseudoObject.cpp | 23 | ||||
| -rw-r--r-- | clang/test/SemaObjC/error-implicit-property.m | 30 |
2 files changed, 50 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaPseudoObject.cpp b/clang/lib/Sema/SemaPseudoObject.cpp index 3a548767719..0e6632964a9 100644 --- a/clang/lib/Sema/SemaPseudoObject.cpp +++ b/clang/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/clang/test/SemaObjC/error-implicit-property.m b/clang/test/SemaObjC/error-implicit-property.m new file mode 100644 index 00000000000..ea0587a7449 --- /dev/null +++ b/clang/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 |

