]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: sort unused declaration errors
authorDaniel Martí <mvdan@mvdan.cc>
Wed, 1 Nov 2017 15:47:46 +0000 (15:47 +0000)
committerDaniel Martí <mvdan@mvdan.cc>
Wed, 1 Nov 2017 16:58:36 +0000 (16:58 +0000)
By position, to ensure deterministic output.

Fixes #22525.

Change-Id: I28777d504a622416678b52afd6fc4c3ef32c12af
Reviewed-on: https://go-review.googlesource.com/75090
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/go/types/issues_test.go
src/go/types/stmt.go

index 388473511856f9d979142b88ebe477dee9626483..02af0cf51b12dfb3a43740cc4ca19b24f714b8e5 100644 (file)
@@ -292,3 +292,25 @@ func main() {
        f("src1", src1)
        f("src2", src2)
 }
+
+func TestIssue22525(t *testing.T) {
+       src := `package p; func f() { var a, b, c, d, e int }`
+       f, err := parser.ParseFile(fset, "", src, 0)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       got := "\n"
+       conf := Config{Error: func(err error) { got += err.Error() + "\n" }}
+       conf.Check(f.Name.Name, fset, []*ast.File{f}, nil) // do not crash
+       want := `
+1:27: a declared but not used
+1:30: b declared but not used
+1:33: c declared but not used
+1:36: d declared but not used
+1:39: e declared but not used
+`
+       if got != want {
+               t.Errorf("got: %swant: %s", got, want)
+       }
+}
index f4feabefdd6910d7fccd272d30ba97816cc482f6..618d1e5fbf2249ea9c5396f7c2c4747875363e7e 100644 (file)
@@ -11,6 +11,7 @@ import (
        "go/ast"
        "go/constant"
        "go/token"
+       "sort"
 )
 
 func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body *ast.BlockStmt) {
@@ -57,11 +58,19 @@ func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body
 }
 
 func (check *Checker) usage(scope *Scope) {
-       for _, obj := range scope.elems {
-               if v, _ := obj.(*Var); v != nil && !v.used {
-                       check.softErrorf(v.pos, "%s declared but not used", v.name)
+       var unused []*Var
+       for _, elem := range scope.elems {
+               if v, _ := elem.(*Var); v != nil && !v.used {
+                       unused = append(unused, v)
                }
        }
+       sort.Slice(unused, func(i, j int) bool {
+               return unused[i].pos < unused[j].pos
+       })
+       for _, v := range unused {
+               check.softErrorf(v.pos, "%s declared but not used", v.name)
+       }
+
        for _, scope := range scope.children {
                check.usage(scope)
        }