aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaExprObjC.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2012-04-19 23:49:39 +0000
committerFariborz Jahanian <fjahanian@apple.com>2012-04-19 23:49:39 +0000
commit9879556f250c7b692228e834d7fca8f1cb118bf6 (patch)
treeab0c7273a32363b5991f8c3005ac941d4aea10ee /lib/Sema/SemaExprObjC.cpp
parent1e77b65b4819bc7a809245b12bd00450b4924025 (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.cpp59
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 &&