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 | 31170398278ff9ef08f6b6427ee596e2ca82a790 (patch) | |
tree | 86f7394656c27ab101ba8899cdefe1907091807e /lib/Sema/SemaExprObjC.cpp | |
parent | 30c009b5fa4d22ddabfe6ad6ba4158a664a4bd83 (diff) |
objective-c: Handle more warning cases for when
message receiver is 'weak' property.
// rdar://10225276
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157946 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprObjC.cpp')
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 5ee3c7b8c9..1b0ba58084 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/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) |