]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: report correct position in redeclaration errors
authorRobert Griesemer <gri@golang.org>
Mon, 22 May 2017 18:20:34 +0000 (11:20 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 22 May 2017 19:20:11 +0000 (19:20 +0000)
When restoring syms, we must also restore the original Lastlineno.
Bug introduced with https://golang.org/cl/41390/.

Fixes #20415.

Change-Id: Ie81d36279d717e330951b52f42dcee4b0025b9f0
Reviewed-on: https://go-review.googlesource.com/43811
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/types/scope.go
src/cmd/compile/internal/types/sym.go
test/fixedbugs/issue20415.go [new file with mode: 0644]

index 64b1b181413ff20119b8e60a98174fd9b7c06440..072b8089b0cb44ddfad3bf972447b65354629504 100644 (file)
@@ -22,6 +22,7 @@ func dcopy(a, b *Sym) {
        a.Name = b.Name
        a.Def = b.Def
        a.Block = b.Block
+       a.Lastlineno = b.Lastlineno
 }
 
 func push() *Sym {
index d9b6d92abe841373320596d3668136f675562f60..f79b07b16c7f7e0aeb58362c4b4be9eeef77bdc1 100644 (file)
@@ -18,15 +18,15 @@ import (
 // allows using Sym pointer equality to test for Go identifier uniqueness when
 // handling selector expressions.
 type Sym struct {
-       Importdef  *Pkg     // where imported definition was found
-       Linkname   string   // link name
-       Lastlineno src.XPos // last declaration for diagnostic
+       Importdef *Pkg   // where imported definition was found
+       Linkname  string // link name
 
        // saved and restored by dcopy
-       Pkg   *Pkg
-       Name  string // object name
-       Def   *Node  // definition: ONAME OTYPE OPACK or OLITERAL
-       Block int32  // blocknumber to catch redeclaration
+       Pkg        *Pkg
+       Name       string   // object name
+       Def        *Node    // definition: ONAME OTYPE OPACK or OLITERAL
+       Block      int32    // blocknumber to catch redeclaration
+       Lastlineno src.XPos // last declaration for diagnostic
 
        flags   bitset8
        Label   *Node // corresponding label (ephemeral)
diff --git a/test/fixedbugs/issue20415.go b/test/fixedbugs/issue20415.go
new file mode 100644 (file)
index 0000000..6f2c342
--- /dev/null
@@ -0,0 +1,33 @@
+// errorcheck
+
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Make sure redeclaration errors report correct position.
+
+package p
+
+// 1
+var f byte
+
+var f interface{} // ERROR "previous declaration at issue20415.go:12"
+
+func _(f int) {
+}
+
+// 2
+var g byte
+
+func _(g int) {
+}
+
+var g interface{} // ERROR "previous declaration at issue20415.go:20"
+
+// 3
+func _(h int) {
+}
+
+var h byte
+
+var h interface{} // ERROR "previous declaration at issue20415.go:31"