diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-04-19 23:49:39 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-04-19 23:49:39 +0000 |
commit | 9879556f250c7b692228e834d7fca8f1cb118bf6 (patch) | |
tree | ab0c7273a32363b5991f8c3005ac941d4aea10ee /lib/Sema/SemaExprObjC.cpp | |
parent | 1e77b65b4819bc7a809245b12bd00450b4924025 (diff) |
objective-arc: Retune my previous patch so warning
is issued on weak property as receiver and not on
any other use of a weak property. // rdar://10225276
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155169 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprObjC.cpp')
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index c187a8deb7..12f5dc7288 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -1323,30 +1323,48 @@ ObjCMethodDecl *Sema::LookupMethodInQualifiedType(Selector Sel, return 0; } -void -Sema::DiagnoseARCUseOfWeakReceiver(NamedDecl *PDecl, - QualType T, SourceLocation Loc) { - if (!getLangOpts().ObjCAutoRefCount) +static void DiagnoseARCUseOfWeakReceiver(Sema &S, Expr *Receiver) { + if (!Receiver) return; - if (T.getObjCLifetime() == Qualifiers::OCL_Weak) { - Diag(Loc, diag::warn_receiver_is_weak) - << (!PDecl ? 0 : (isa<ObjCPropertyDecl>(PDecl) ? 1 : 2)); - if (PDecl) { - if (isa<ObjCPropertyDecl>(PDecl)) - Diag(PDecl->getLocation(), diag::note_property_declare); - else - Diag(PDecl->getLocation(), diag::note_method_declared_at) << PDecl; + Expr *RExpr = Receiver->IgnoreParenImpCasts(); + SourceLocation Loc = RExpr->getLocStart(); + QualType T = RExpr->getType(); + ObjCPropertyDecl *PDecl = 0; + ObjCMethodDecl *GDecl = 0; + if (PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(RExpr)) { + RExpr = POE->getSyntacticForm(); + if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(RExpr)) { + if (PRE->isImplicitProperty()) { + GDecl = PRE->getImplicitPropertyGetter(); + if (GDecl) { + T = GDecl->getResultType(); + } + } + else { + PDecl = PRE->getExplicitProperty(); + if (PDecl) { + T = PDecl->getType(); + } + } } + } + + if (T.getObjCLifetime() == Qualifiers::OCL_Weak) { + S.Diag(Loc, diag::warn_receiver_is_weak) + << ((!PDecl && !GDecl) ? 0 : (PDecl ? 1 : 2)); + if (PDecl) + S.Diag(PDecl->getLocation(), diag::note_property_declare); + else if (GDecl) + S.Diag(GDecl->getLocation(), diag::note_method_declared_at) << GDecl; return; } - if (PDecl) - if (ObjCPropertyDecl *Prop = dyn_cast<ObjCPropertyDecl>(PDecl)) - if (Prop->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak) { - Diag(Loc, diag::warn_receiver_is_weak) << 1; - Diag(Prop->getLocation(), diag::note_property_declare); - } + if (PDecl && + (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak)) { + S.Diag(Loc, diag::warn_receiver_is_weak) << 1; + S.Diag(PDecl->getLocation(), diag::note_property_declare); + } } /// HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an @@ -2404,10 +2422,7 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, } if (getLangOpts().ObjCAutoRefCount) { - if (Receiver) - DiagnoseARCUseOfWeakReceiver(0 /* PDecl */, - Receiver->IgnoreParenImpCasts()->getType(), - Receiver->getLocStart()); + DiagnoseARCUseOfWeakReceiver(*this, Receiver); // In ARC, annotate delegate init calls. if (Result->getMethodFamily() == OMF_init && |