cmd/compile/internal/gc: fix initialization logic

Also add relevant test.

Fixes #13343.

Change-Id: Ib1e65af1d643d501de89adee3618eddbf6c69c9e
Reviewed-on: https://go-review.googlesource.com/18159
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Kevin Vu 2016-01-03 18:44:15 -08:00 committed by Russ Cox
parent 7e24e89944
commit aaabe3d849
2 changed files with 21 additions and 2 deletions

View file

@ -124,10 +124,10 @@ func init1(n *Node, out **NodeList) {
}
case OAS2FUNC, OAS2MAPR, OAS2DOTTYPE, OAS2RECV:
if defn.Initorder != InitNotStarted {
if defn.Initorder == InitDone {
break
}
defn.Initorder = InitDone
defn.Initorder = InitPending
for l := defn.Rlist; l != nil; l = l.Next {
init1(l.N, out)
}
@ -135,6 +135,7 @@ func init1(n *Node, out **NodeList) {
Dump("nonstatic", defn)
}
*out = list(*out, defn)
defn.Initorder = InitDone
}
}

View file

@ -0,0 +1,18 @@
// errorcheck
// Copyright 2015 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.
package main
var (
a, b = f() // ERROR "initialization loop|depends upon itself"
c = b
)
func f() (int, int) {
return c, c
}
func main() {}