From: Emmanuel T Odeke Date: Wed, 18 Jul 2018 02:02:53 +0000 (-0700) Subject: cmd/compile: fix label redefinition error column numbers X-Git-Tag: go1.12beta1~752 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0b63086f64ad7da114b003b98f1c78a6beb6ef26;p=gostls13.git cmd/compile: fix label redefinition error column numbers Ensure that label redefinition error column numbers print the actual start of the label instead of the position of the label's delimiting token ":". For example, given this program: package main func main() { foo: foo: foo: foo : } * Before: main.go:5:13: label foo defined and not used main.go:6:7: label foo already defined at main.go:5:13 main.go:7:4: label foo already defined at main.go:5:13 main.go:8:16: label foo already defined at main.go:5:13 * After: main.go:5:13: label foo defined and not used main.go:6:4: label foo already defined at main.go:5:13 main.go:7:1: label foo already defined at main.go:5:13 main.go:8:1: label foo already defined at main.go:5:13 Fixes #26411 Change-Id: I8eb874b97fdc8862547176d57ac2fa0f075f2367 Reviewed-on: https://go-review.googlesource.com/c/124595 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- diff --git a/src/cmd/compile/internal/syntax/branches.go b/src/cmd/compile/internal/syntax/branches.go index a03e2734d2..56e97c71d8 100644 --- a/src/cmd/compile/internal/syntax/branches.go +++ b/src/cmd/compile/internal/syntax/branches.go @@ -77,7 +77,7 @@ func (ls *labelScope) declare(b *block, s *LabeledStmt) *label { labels = make(map[string]*label) ls.labels = labels } else if alt := labels[name]; alt != nil { - ls.err(s.Pos(), "label %s already defined at %s", name, alt.lstmt.Label.Pos().String()) + ls.err(s.Label.Pos(), "label %s already defined at %s", name, alt.lstmt.Label.Pos().String()) return alt } l := &label{b, s, false} diff --git a/test/fixedbugs/issue26411.go b/test/fixedbugs/issue26411.go new file mode 100644 index 0000000000..789c176dae --- /dev/null +++ b/test/fixedbugs/issue26411.go @@ -0,0 +1,94 @@ +// +build !nacl,!js +// run + +// Copyright 2018 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. + +// Ensure that label redefinition errors print out +// a column number that matches the start of the current label's +// definition instead of the label delimiting token ":" + +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" +) + +func main() { + tmpdir, err := ioutil.TempDir("", "issue26411") + if err != nil { + log.Fatalf("Failed to create temporary directory: %v", err) + } + defer os.RemoveAll(tmpdir) + + samples := []struct { + code string + wantOutput []string + }{ + { + code: ` +package main + +func main() { +foo: +foo: +} +`, + wantOutput: []string{ + "^.+:5:1: label foo defined and not used\n", + ".+:6:1: label foo already defined at .+:5:1\n$", + }, + }, + { + code: ` +package main + +func main() { + + bar: + bar: +bar: +bar : +} +`, + + wantOutput: []string{ + "^.+:6:13: label bar defined and not used\n", + ".+:7:4: label bar already defined at .+:6:13\n", + ".+:8:1: label bar already defined at .+:6:13\n", + ".+:9:1: label bar already defined at .+:6:13\n$", + }, + }, + } + + for i, sample := range samples { + filename := filepath.Join(tmpdir, fmt.Sprintf("%d.go", i)) + if err := ioutil.WriteFile(filename, []byte(sample.code), 0644); err != nil { + log.Printf("#%d: failed to create file %s", i, filename) + continue + } + output, _ := exec.Command("go", "tool", "compile", filename).CombinedOutput() + + // Now match the output + for _, regex := range sample.wantOutput { + reg := regexp.MustCompile(regex) + matches := reg.FindAll(output, -1) + for _, match := range matches { + index := bytes.Index(output, match) + output = bytes.Join([][]byte{output[:index], output[index+len(match):]}, []byte("")) + } + } + + if len(output) != 0 { + log.Printf("#%d: did not match all the output\nResidual output:\n\t%s", i, output) + } + } +}