diff --git a/go/types/api_test.go b/go/types/api_test.go index 1abcb973..e201030f 100644 --- a/go/types/api_test.go +++ b/go/types/api_test.go @@ -479,14 +479,16 @@ func TestInitOrderInfo(t *testing.T) { func TestFiles(t *testing.T) { var sources = []string{ "package p; type T struct{}; func (T) m1() {}", - "package p; func (T) m2() {}; var _ interface{ m1(); m2() } = T{}", - "package p; func (T) m3() {}; var _ interface{ m1(); m2(); m3() } = T{}", + "package p; func (T) m2() {}; var x interface{ m1(); m2() } = T{}", + "package p; func (T) m3() {}; var y interface{ m1(); m2(); m3() } = T{}", + "package p", } var conf Config fset := token.NewFileSet() pkg := NewPackage("p", "p") - check := NewChecker(&conf, fset, pkg, nil) + var info Info + check := NewChecker(&conf, fset, pkg, &info) for i, src := range sources { filename := fmt.Sprintf("sources%d", i) @@ -498,6 +500,17 @@ func TestFiles(t *testing.T) { t.Error(err) } } + + // check InitOrder is [x y] + var vars []string + for _, init := range info.InitOrder { + for _, v := range init.Lhs { + vars = append(vars, v.Name()) + } + } + if got, want := fmt.Sprint(vars), "[x y]"; got != want { + t.Errorf("InitOrder == %s, want %s", got, want) + } } func TestSelection(t *testing.T) { diff --git a/go/types/initorder.go b/go/types/initorder.go index da5f541e..2d236100 100644 --- a/go/types/initorder.go +++ b/go/types/initorder.go @@ -11,6 +11,10 @@ import ( // initOrder computes the Info.InitOrder for package variables. func (check *Checker) initOrder() { + // An InitOrder may already have been computed if a package is + // built from several calls to (*Checker).Files. Clear it. + check.Info.InitOrder = check.Info.InitOrder[:0] + // compute the object dependency graph and // initialize a priority queue with the list // of graph nodes