diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-06-04 19:16:34 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-06-04 19:16:34 +0000 |
commit | 22535def431ff4bb19f128fd1347774e79bc0f1d (patch) | |
tree | 736e936f96d06d00c841cd3cbd740e019172ccd4 /clang/lib/Sema/SemaExprObjC.cpp | |
parent | 8388d247014c3e5e6705d82168b55db101e991d5 (diff) | |
download | bcm5719-llvm-22535def431ff4bb19f128fd1347774e79bc0f1d.tar.gz bcm5719-llvm-22535def431ff4bb19f128fd1347774e79bc0f1d.zip |
objective-c: Handle more warning cases for when
message receiver is 'weak' property.
// rdar://10225276
llvm-svn: 157946
Diffstat (limited to 'clang/lib/Sema/SemaExprObjC.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 5ee3c7b8c94..1b0ba580841 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -1347,6 +1347,9 @@ static void DiagnoseARCUseOfWeakReceiver(Sema &S, Expr *Receiver) { if (!Receiver) return; + if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(Receiver)) + Receiver = OVE->getSourceExpr(); + Expr *RExpr = Receiver->IgnoreParenImpCasts(); SourceLocation Loc = RExpr->getLocStart(); QualType T = RExpr->getType(); @@ -1369,6 +1372,20 @@ static void DiagnoseARCUseOfWeakReceiver(Sema &S, Expr *Receiver) { } } } + else if (ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(RExpr)) { + // See if receiver is a method which envokes a synthesized getter + // backing a 'weak' property. + ObjCMethodDecl *Method = ME->getMethodDecl(); + if (Method && Method->isSynthesized()) { + Selector Sel = Method->getSelector(); + if (Sel.getNumArgs() == 0) + PDecl = + S.LookupPropertyDecl(Method->getClassInterface(), + Sel.getIdentifierInfoForSlot(0)); + if (PDecl) + T = PDecl->getType(); + } + } if (T.getObjCLifetime() == Qualifiers::OCL_Weak) { S.Diag(Loc, diag::warn_receiver_is_weak) |