Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit a2c91e7

Browse files
author
Fariborz Jahanian
committed
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
1 parent 0ddb097 commit a2c91e7

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

lib/Sema/SemaPseudoObject.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ namespace {
214214

215215
ObjCMethodDecl *Setter;
216216
Selector SetterSelector;
217+
Selector GetterSelector;
217218

218219
public:
219220
ObjCPropertyOpBuilder(Sema &S, ObjCPropertyRefExpr *refExpr) :
@@ -475,8 +476,24 @@ bool ObjCPropertyOpBuilder::findGetter() {
475476

476477
// For implicit properties, just trust the lookup we already did.
477478
if (RefExpr->isImplicitProperty()) {
478-
Getter = RefExpr->getImplicitPropertyGetter();
479-
return (Getter != 0);
479+
if ((Getter = RefExpr->getImplicitPropertyGetter())) {
480+
GetterSelector = Getter->getSelector();
481+
return true;
482+
}
483+
else {
484+
// Must build the getter selector the hard way.
485+
ObjCMethodDecl *setter = RefExpr->getImplicitPropertySetter();
486+
assert(setter && "both setter and getter are null - cannot happen");
487+
IdentifierInfo *setterName =
488+
setter->getSelector().getIdentifierInfoForSlot(0);
489+
const char *compStr = setterName->getNameStart();
490+
compStr += 3;
491+
IdentifierInfo *getterName = &S.Context.Idents.get(compStr);
492+
GetterSelector =
493+
S.PP.getSelectorTable().getNullarySelector(getterName);
494+
return false;
495+
496+
}
480497
}
481498

482499
ObjCPropertyDecl *prop = RefExpr->getExplicitProperty();
@@ -776,7 +793,7 @@ ObjCPropertyOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc,
776793
assert(RefExpr->isImplicitProperty());
777794
S.Diag(opcLoc, diag::err_nogetter_property_incdec)
778795
<< unsigned(UnaryOperator::isDecrementOp(opcode))
779-
<< RefExpr->getImplicitPropertyGetter()->getSelector() // FIXME!
796+
<< GetterSelector
780797
<< op->getSourceRange();
781798
return ExprError();
782799
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// RUN: %clang_cc1 -verify %s
2+
// rdar://11273060
3+
4+
@interface I
5+
- (void) setP : (int)arg;
6+
@end
7+
8+
@interface J
9+
- (int) P;
10+
@end
11+
12+
@interface K @end
13+
14+
@interface II @end
15+
16+
@implementation II
17+
- (void) Meth : (I*) arg {
18+
arg.P++; // expected-error {{no getter method 'P' for increment of property}}
19+
--arg.P; // expected-error {{no getter method 'P' for decrement of property}}
20+
}
21+
- (void) Meth1 : (J*) arg {
22+
arg.P++; // expected-error {{no setter method 'setP:' for increment of property}}
23+
arg.P--; // expected-error {{no setter method 'setP:' for decrement of property}}
24+
}
25+
26+
- (void) Meth2 : (K*) arg {
27+
arg.P++; // expected-error {{property 'P' not found on object of type 'K *'}}
28+
arg.P--; // expected-error {{property 'P' not found on object of type 'K *'}}
29+
}
30+
@end

0 commit comments

Comments
 (0)