Skip to content

Commit 0e2df22

Browse files
committed
Fix issue where non-pattern-binding condition would break SE-0365 unwrapped self check
1 parent 327c7d0 commit 0e2df22

File tree

4 files changed

+160
-0
lines changed

4 files changed

+160
-0
lines changed

lib/AST/UnqualifiedLookup.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,10 @@ bool implicitSelfReferenceIsUnwrapped(const ValueDecl *selfDecl,
400400
// Find the condition that defined the self decl,
401401
// and check that both its LHS and RHS are 'self'
402402
for (auto cond : conditionalStmt->getCond()) {
403+
if (cond.getKind() != StmtConditionElement::CK_PatternBinding) {
404+
continue;
405+
}
406+
403407
if (auto pattern = cond.getPattern()) {
404408
bool isSelfRebinding = false;
405409

lib/Sema/MiscDiagnostics.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,6 +1708,10 @@ static void diagnoseImplicitSelfUseInClosure(const Expr *E,
17081708
// Find the condition that defined the self decl,
17091709
// and check that both its LHS and RHS are 'self'
17101710
for (auto cond : conditionalStmt->getCond()) {
1711+
if (cond.getKind() != StmtConditionElement::CK_PatternBinding) {
1712+
continue;
1713+
}
1714+
17111715
if (auto OSP = dyn_cast<OptionalSomePattern>(cond.getPattern())) {
17121716
if (OSP->getSubPattern()->getBoundName() != Ctx.Id_self) {
17131717
continue;

test/expr/closure/closures.swift

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,6 +983,82 @@ class NoImplicitSelfInInnerClass {
983983
}
984984

985985
}
986+
987+
func foo(condition: Bool) {
988+
doVoidStuff { [weak self] in
989+
guard condition, let self else { return }
990+
method()
991+
}
992+
993+
doVoidStuff { [weak self] in
994+
guard let self, condition else { return }
995+
method()
996+
}
997+
998+
doVoidStuffNonEscaping { [weak self] in
999+
guard condition, let self else { return }
1000+
method()
1001+
}
1002+
1003+
doVoidStuffNonEscaping { [weak self] in
1004+
guard let self, condition else { return }
1005+
method()
1006+
}
1007+
}
1008+
1009+
func foo(optionalCondition: Bool?) {
1010+
doVoidStuff { [weak self] in
1011+
guard let optionalCondition, optionalCondition, let self else { return }
1012+
method()
1013+
}
1014+
1015+
doVoidStuff { [weak self] in
1016+
guard let self, let optionalCondition, optionalCondition else { return }
1017+
method()
1018+
}
1019+
1020+
doVoidStuff { [weak self] in
1021+
guard let optionalCondition, let self, optionalCondition else { return }
1022+
method()
1023+
}
1024+
1025+
doVoidStuffNonEscaping { [weak self] in
1026+
guard let optionalCondition, optionalCondition, let self else { return }
1027+
method()
1028+
}
1029+
1030+
doVoidStuffNonEscaping { [weak self] in
1031+
guard let self, let optionalCondition, optionalCondition else { return }
1032+
method()
1033+
}
1034+
1035+
doVoidStuffNonEscaping { [weak self] in
1036+
guard let optionalCondition, let self, optionalCondition else { return }
1037+
method()
1038+
}
1039+
}
1040+
1041+
func foo() {
1042+
doVoidStuff { [weak self] in
1043+
guard #available(SwiftStdlib 5.8, *), let self else { return }
1044+
method()
1045+
}
1046+
1047+
doVoidStuff { [weak self] in
1048+
guard let self, #available(SwiftStdlib 5.8, *) else { return }
1049+
method()
1050+
}
1051+
1052+
doVoidStuffNonEscaping { [weak self] in
1053+
guard #available(SwiftStdlib 5.8, *), let self else { return }
1054+
method()
1055+
}
1056+
1057+
doVoidStuffNonEscaping { [weak self] in
1058+
guard let self, #available(SwiftStdlib 5.8, *) else { return }
1059+
method()
1060+
}
1061+
}
9861062
}
9871063

9881064
public class TestRebindingSelfIsDisallowed {

test/expr/closure/closures_swift6.swift

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,82 @@ class NoImplicitSelfInInnerClass {
210210
}
211211
}
212212
}
213+
214+
func foo(condition: Bool) {
215+
doVoidStuff { [weak self] in
216+
guard condition, let self else { return }
217+
method()
218+
}
219+
220+
doVoidStuff { [weak self] in
221+
guard let self, condition else { return }
222+
method()
223+
}
224+
225+
doVoidStuffNonEscaping { [weak self] in
226+
guard condition, let self else { return }
227+
method()
228+
}
229+
230+
doVoidStuffNonEscaping { [weak self] in
231+
guard let self, condition else { return }
232+
method()
233+
}
234+
}
235+
236+
func foo(optionalCondition: Bool?) {
237+
doVoidStuff { [weak self] in
238+
guard let optionalCondition, optionalCondition, let self else { return }
239+
method()
240+
}
241+
242+
doVoidStuff { [weak self] in
243+
guard let self, let optionalCondition, optionalCondition else { return }
244+
method()
245+
}
246+
247+
doVoidStuff { [weak self] in
248+
guard let optionalCondition, let self, optionalCondition else { return }
249+
method()
250+
}
251+
252+
doVoidStuffNonEscaping { [weak self] in
253+
guard let optionalCondition, optionalCondition, let self else { return }
254+
method()
255+
}
256+
257+
doVoidStuffNonEscaping { [weak self] in
258+
guard let self, let optionalCondition, optionalCondition else { return }
259+
method()
260+
}
261+
262+
doVoidStuffNonEscaping { [weak self] in
263+
guard let optionalCondition, let self, optionalCondition else { return }
264+
method()
265+
}
266+
}
267+
268+
func foo() {
269+
doVoidStuff { [weak self] in
270+
guard #available(SwiftStdlib 5.8, *), let self else { return }
271+
method()
272+
}
273+
274+
doVoidStuff { [weak self] in
275+
guard let self, #available(SwiftStdlib 5.8, *) else { return }
276+
method()
277+
}
278+
279+
doVoidStuffNonEscaping { [weak self] in
280+
guard #available(SwiftStdlib 5.8, *), let self else { return }
281+
method()
282+
}
283+
284+
doVoidStuffNonEscaping { [weak self] in
285+
guard let self, #available(SwiftStdlib 5.8, *) else { return }
286+
method()
287+
}
288+
}
213289
}
214290

215291
public class TestRebindingSelfIsDisallowed {

0 commit comments

Comments
 (0)