Skip to content

Commit 2a5c7dd

Browse files
committed
Quick fix for off-by-count errors in pattern binding diagnostics
Rather than return the last var pattern, only match on the ones that match the vardecl the diagnostic is warning about.
1 parent 5164668 commit 2a5c7dd

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

lib/Sema/MiscDiagnostics.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2315,7 +2315,8 @@ VarDeclUsageChecker::~VarDeclUsageChecker() {
23152315
VarPattern *foundVP = nullptr;
23162316
pattern->forEachNode([&](Pattern *P) {
23172317
if (auto *VP = dyn_cast<VarPattern>(P))
2318-
foundVP = VP;
2318+
if (VP->getSingleVar() == var)
2319+
foundVP = VP;
23192320
});
23202321

23212322
if (foundVP && !foundVP->isLet())

test/decl/var/usage.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@ class TestClass {
4848
}
4949
}
5050

51+
enum TestEnum {
52+
case Test(Int, Int, Int)
53+
}
54+
55+
func testEnum() -> Int {
56+
let ev = TestEnum.Test(5, 6, 7)
57+
switch ev {
58+
case .Test(var i, var j, var k): // expected-warning {{variable 'i' was never mutated; consider changing to 'let' constant}} {{14-17=let}}
59+
// expected-warning@-1 {{variable 'j' was never mutated; consider changing to 'let' constant}} {{21-24=let}}
60+
// expected-warning@-2 {{variable 'k' was never mutated; consider changing to 'let' constant}} {{28-31=let}}
61+
return i + j + k
62+
default:
63+
return 0
64+
}
65+
}
5166

5267
func nestedFunction() -> Int {
5368
var x = 42 // No warning about being never-set.
@@ -231,4 +246,3 @@ func test(_ a : Int?, b : Any) {
231246

232247
}
233248

234-

0 commit comments

Comments
 (0)