Skip to content

Commit 84847bc

Browse files
committed
[Sema] Relax a check in VarDeclUsageChecker
We don't want to just check the first pattern, we're interested in the first pattern that binds the given variable. That can be determined by checking if it's canonical or not.
1 parent 79fe1b3 commit 84847bc

File tree

2 files changed

+5
-9
lines changed

2 files changed

+5
-9
lines changed

lib/Sema/MiscDiagnostics.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4007,12 +4007,8 @@ VarDeclUsageChecker::~VarDeclUsageChecker() {
40074007

40084008
if (auto *caseStmt =
40094009
dyn_cast_or_null<CaseStmt>(var->getRecursiveParentPatternStmt())) {
4010-
// Only diagnose VarDecls from the first CaseLabelItem in CaseStmts, as
4011-
// the remaining items must match it anyway.
4012-
auto caseItems = caseStmt->getCaseLabelItems();
4013-
assert(!caseItems.empty() &&
4014-
"If we have any case stmt var decls, we should have a case item");
4015-
if (!caseItems.front().getPattern()->containsVarDecl(var))
4010+
// Only diagnose for the parent-most VarDecl.
4011+
if (var->getParentVarDecl())
40164012
continue;
40174013

40184014
auto *childVar = var->getCorrespondingCaseBodyVariable().get();

test/Parse/switch.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,10 @@ switch t {
200200
case (var a, 2), (1, _): // expected-error {{'a' must be bound in every pattern}} expected-warning {{variable 'a' was never used; consider replacing with '_' or removing it}}
201201
()
202202

203-
case (_, 2), (var a, _): // expected-error {{'a' must be bound in every pattern}}
203+
case (_, 2), (var a, _): // expected-error {{'a' must be bound in every pattern}} expected-warning {{variable 'a' was never used; consider replacing with '_' or removing it}}
204204
()
205205

206-
case (var a, 2), (1, var b): // expected-error {{'a' must be bound in every pattern}} expected-error {{'b' must be bound in every pattern}} expected-warning {{variable 'a' was never used; consider replacing with '_' or removing it}}
206+
case (var a, 2), (1, var b): // expected-error {{'a' must be bound in every pattern}} expected-error {{'b' must be bound in every pattern}} expected-warning {{variable 'a' was never used; consider replacing with '_' or removing it}} expected-warning {{variable 'b' was never used; consider replacing with '_' or removing it}}
207207
()
208208

209209
case (var a, 2): // expected-error {{'case' label in a 'switch' must have at least one executable statement}} {{17-17= break}} expected-warning {{variable 'a' was never used; consider replacing with '_' or removing it}}
@@ -221,7 +221,7 @@ case (1, var b): // expected-warning {{variable 'b' was never used; consider rep
221221
case (1, let b): // let bindings expected-warning {{immutable value 'b' was never used; consider replacing with '_' or removing it}}
222222
()
223223

224-
case (_, 2), (let a, _): // expected-error {{'a' must be bound in every pattern}} expected-warning {{case is already handled by previous patterns; consider removing it}}
224+
case (_, 2), (let a, _): // expected-error {{'a' must be bound in every pattern}} expected-warning {{case is already handled by previous patterns; consider removing it}} expected-warning {{immutable value 'a' was never used; consider replacing with '_' or removing it}}
225225
()
226226

227227
// OK

0 commit comments

Comments
 (0)