From: Fariborz Jahanian Date: Thu, 19 Apr 2012 23:49:39 +0000 (+0000) Subject: objective-arc: Retune my previous patch so warning X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9879556f250c7b692228e834d7fca8f1cb118bf6;p=clang 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 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 5ad60ee9e8..e84a554505 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -5901,9 +5901,6 @@ public: bool IsInstance); bool inferObjCARCLifetime(ValueDecl *decl); - - void DiagnoseARCUseOfWeakReceiver(NamedDecl *PDecl, - QualType T, SourceLocation Loc); ExprResult HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, 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(PDecl) ? 1 : 2)); - if (PDecl) { - if (isa(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(RExpr)) { + RExpr = POE->getSyntacticForm(); + if (ObjCPropertyRefExpr *PRE = dyn_cast(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(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 && diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp index 078b0e4bc4..0e6632964a 100644 --- a/lib/Sema/SemaPseudoObject.cpp +++ b/lib/Sema/SemaPseudoObject.cpp @@ -478,8 +478,6 @@ bool ObjCPropertyOpBuilder::findGetter() { if (RefExpr->isImplicitProperty()) { if ((Getter = RefExpr->getImplicitPropertyGetter())) { GetterSelector = Getter->getSelector(); - S.DiagnoseARCUseOfWeakReceiver(Getter, Getter->getResultType(), - RefExpr->getLocation()); return true; } else { @@ -499,8 +497,6 @@ bool ObjCPropertyOpBuilder::findGetter() { } ObjCPropertyDecl *prop = RefExpr->getExplicitProperty(); - S.DiagnoseARCUseOfWeakReceiver(prop, prop->getType(), - RefExpr->getLocation()); Getter = LookupMethodInReceiverType(S, prop->getGetterName(), RefExpr); return (Getter != 0); } diff --git a/test/SemaObjC/weak-receiver-warn.m b/test/SemaObjC/weak-receiver-warn.m index 5ee53fb063..c2a5d48186 100644 --- a/test/SemaObjC/weak-receiver-warn.m +++ b/test/SemaObjC/weak-receiver-warn.m @@ -23,21 +23,21 @@ void test0(Test0 *x) { __weak Test* weak_prop; } - (void) Meth; -@property __weak Test* weak_prop; // expected-note 2 {{property declared here}} -@property (weak, atomic) id weak_atomic_prop; // expected-note 2 {{property declared here}} -- (__weak id) P; // expected-note 2 {{method 'P' declared here}} +@property __weak Test* weak_prop; // expected-note {{property declared here}} +@property (weak, atomic) id weak_atomic_prop; // expected-note {{property declared here}} +- (__weak id) P; // expected-note {{method 'P' declared here}} @end @implementation Test - (void) Meth { - if (self.weak_prop) { // expected-warning {{weak property may be unpredictably null in ARC mode}} + if (self.weak_prop) { self.weak_prop = 0; } - if (self.weak_atomic_prop) { // expected-warning {{weak property may be unpredictably null in ARC mode}} + if (self.weak_atomic_prop) { self.weak_atomic_prop = 0; } [self.weak_prop Meth]; // expected-warning {{weak property may be unpredictably null in ARC mode}} - id pi = self.P; // expected-warning {{weak implicit property may be unpredictably null in ARC mode}} + id pi = self.P; [self.weak_atomic_prop Meth]; // expected-warning {{weak property may be unpredictably null in ARC mode}}