From 2a5c7ddf90a0610b3e4f18237ba78ee1480b3ee6 Mon Sep 17 00:00:00 2001 From: Robert Widmann Date: Sun, 10 Jul 2016 22:23:01 -0700 Subject: [PATCH] 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. --- lib/Sema/MiscDiagnostics.cpp | 3 ++- test/decl/var/usage.swift | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/Sema/MiscDiagnostics.cpp b/lib/Sema/MiscDiagnostics.cpp index df7ba447c13ce..fbc248e20ac33 100644 --- a/lib/Sema/MiscDiagnostics.cpp +++ b/lib/Sema/MiscDiagnostics.cpp @@ -2315,7 +2315,8 @@ VarDeclUsageChecker::~VarDeclUsageChecker() { VarPattern *foundVP = nullptr; pattern->forEachNode([&](Pattern *P) { if (auto *VP = dyn_cast(P)) - foundVP = VP; + if (VP->getSingleVar() == var) + foundVP = VP; }); if (foundVP && !foundVP->isLet()) diff --git a/test/decl/var/usage.swift b/test/decl/var/usage.swift index c638c51381002..3c0ad0c7d693a 100644 --- a/test/decl/var/usage.swift +++ b/test/decl/var/usage.swift @@ -48,6 +48,21 @@ class TestClass { } } +enum TestEnum { + case Test(Int, Int, Int) +} + +func testEnum() -> Int { + let ev = TestEnum.Test(5, 6, 7) + switch ev { + case .Test(var i, var j, var k): // expected-warning {{variable 'i' was never mutated; consider changing to 'let' constant}} {{14-17=let}} + // expected-warning@-1 {{variable 'j' was never mutated; consider changing to 'let' constant}} {{21-24=let}} + // expected-warning@-2 {{variable 'k' was never mutated; consider changing to 'let' constant}} {{28-31=let}} + return i + j + k + default: + return 0 + } +} func nestedFunction() -> Int { var x = 42 // No warning about being never-set. @@ -231,4 +246,3 @@ func test(_ a : Int?, b : Any) { } -