cmd/vet: fix a bad case of shadow check about redeclaration
`go tools vet -shadow` ignored the case like this form
```golang
func shadowBlock() {
var a int
{
var a = 3
_ = a
}
_ = a
}
```
This commit fix it on "idiomaticRedecl" func, and add the code above in testcase.
Change-Id: I007f8287766f59cd7ded86072ba6bf6743c392be
GitHub-Last-Rev: b8b302b2048d709a39fb17496ba80917f9f4c889
GitHub-Pull-Request: golang/tools#143
Reviewed-on: https://go-review.googlesource.com/c/tools/+/189158
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/go/analysis/passes/shadow/shadow.go b/go/analysis/passes/shadow/shadow.go
index add01a6..c1a3b0a 100644
--- a/go/analysis/passes/shadow/shadow.go
+++ b/go/analysis/passes/shadow/shadow.go
@@ -208,14 +208,15 @@
func idiomaticRedecl(d *ast.ValueSpec) bool {
// Don't complain about deliberate redeclarations of the form
// var i, j = i, j
+ // Don't ignore redeclarations of the form
+ // var i = 3
if len(d.Names) != len(d.Values) {
return false
}
for i, lhs := range d.Names {
- if rhs, ok := d.Values[i].(*ast.Ident); ok {
- if lhs.Name != rhs.Name {
- return false
- }
+ rhs, ok := d.Values[i].(*ast.Ident)
+ if !ok || lhs.Name != rhs.Name {
+ return false
}
}
return true
diff --git a/go/analysis/passes/shadow/testdata/src/a/a.go b/go/analysis/passes/shadow/testdata/src/a/a.go
index 57c6629..b2fa9b2 100644
--- a/go/analysis/passes/shadow/testdata/src/a/a.go
+++ b/go/analysis/passes/shadow/testdata/src/a/a.go
@@ -89,3 +89,12 @@
}
}
}
+
+func shadowBlock() {
+ var a int
+ {
+ var a = 3 // want "declaration of .a. shadows declaration at line 94"
+ _ = a
+ }
+ _ = a
+}