Warn on weak properties declared in protocols as well.

Previously this caused a crash, since protocols are not interfaces.

llvm-svn: 159357
This commit is contained in:
Jordan Rose 2012-06-28 16:39:28 +00:00
parent 181d67ecb1
commit ee3d99f6be
2 changed files with 16 additions and 2 deletions

View File

@ -1379,10 +1379,12 @@ static void DiagnoseARCUseOfWeakReceiver(Sema &S, Expr *Receiver) {
ObjCMethodDecl *Method = ME->getMethodDecl();
if (Method && Method->isSynthesized()) {
Selector Sel = Method->getSelector();
if (Sel.getNumArgs() == 0)
if (Sel.getNumArgs() == 0) {
const DeclContext *Container = Method->getDeclContext();
PDecl =
S.LookupPropertyDecl(Method->getClassInterface(),
S.LookupPropertyDecl(cast<ObjCContainerDecl>(Container),
Sel.getIdentifierInfoForSlot(0));
}
if (PDecl)
T = PDecl->getType();
}

View File

@ -66,3 +66,15 @@ void test0(Test0 *x) {
}
@end
// Weak properties on protocols can be synthesized by an adopting class.
@protocol MyProtocol
@property (weak) id object; // expected-note 2 {{property declared here}}
@end
void testProtocol(id <MyProtocol> input) {
[[input object] Meth]; // expected-warning {{weak property may be unpredictably null in ARC mode}}
[input.object Meth]; // expected-warning {{weak property may be unpredictably null in ARC mode}}
}