From: Bob Wilson Date: Wed, 25 May 2016 05:41:57 +0000 (+0000) Subject: arc-repeated-use-of-weak should not warn about IBOutlet properties X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=756a4a5956a4c162021fa96f5cca81188811f7ed;p=clang arc-repeated-use-of-weak should not warn about IBOutlet properties Revision r211132 was supposed to disable -Warc-repeated-use-of-weak for Objective-C properties marked with the IBOutlet attribute. Those properties are supposed to be weak but they are only accessed from the main thread so there is no risk of asynchronous updates setting them to nil. That combination makes -Warc-repeated-use-of-weak very noisy. The previous change only handled one kind of access to weak IBOutlet properties. Instead of trying to add checks for all the different kinds of property accesses, this patch removes the previous special case check and adds a check at the point where the diagnostic is reported. rdar://21366461 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@270665 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index 3f2c41b67b..eb45315a31 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -1334,6 +1334,12 @@ static void diagnoseRepeatedUseOfWeak(Sema &S, else llvm_unreachable("Unexpected weak object kind!"); + // Do not warn about IBOutlet weak property receivers being set to null + // since they are typically only used from the main thread. + if (const ObjCPropertyDecl *Prop = dyn_cast(D)) + if (Prop->hasAttr()) + continue; + // Show the first time the object was read. S.Diag(FirstRead->getLocStart(), DiagKind) << int(ObjectKind) << D << int(FunctionKind) diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp index 62c823b363..c93d800f96 100644 --- a/lib/Sema/SemaPseudoObject.cpp +++ b/lib/Sema/SemaPseudoObject.cpp @@ -578,7 +578,7 @@ bool ObjCPropertyOpBuilder::isWeakProperty() const { if (RefExpr->isExplicitProperty()) { const ObjCPropertyDecl *Prop = RefExpr->getExplicitProperty(); if (Prop->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak) - return !Prop->hasAttr(); + return true; T = Prop->getType(); } else if (Getter) { diff --git a/test/SemaObjC/iboutlet.m b/test/SemaObjC/iboutlet.m index 2ce4ce1d87..7bd86d4668 100644 --- a/test/SemaObjC/iboutlet.m +++ b/test/SemaObjC/iboutlet.m @@ -41,6 +41,7 @@ IBInspectable @property (readonly) IBOutlet NSView *myView1; // expected-warning // rdar://15885642 @interface WeakOutlet +@property int Number; @property IBOutlet __weak WeakOutlet* WeakProp; @end @@ -50,3 +51,9 @@ WeakOutlet* func() { pwi.WeakProp = pwi.WeakProp; return pwi.WeakProp; } + +WeakOutlet* func2(WeakOutlet* pwi) { + [[pwi WeakProp] setNumber:0]; + [[pwi WeakProp] setNumber:1]; + return [pwi WeakProp]; +}