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 /clang/lib | |
| 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
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaPseudoObject.cpp | 23 |
1 files changed, 20 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(); } |

