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
+}