1
0
mirror of https://github.com/golang/go synced 2024-11-23 06:40:05 -07:00

cmd/compile: report correct position in redeclaration errors

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>
This commit is contained in:
Robert Griesemer 2017-05-22 11:20:34 -07:00
parent 8f6d68ebaa
commit d79bb78a71
3 changed files with 41 additions and 7 deletions

View 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 {

View 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)

View File

@ -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"