Commit aaabe3d8 authored by Kevin Vu's avatar Kevin Vu Committed by Russ Cox

cmd/compile/internal/gc: fix initialization logic

Also add relevant test.

Fixes #13343.

Change-Id: Ib1e65af1d643d501de89adee3618eddbf6c69c9e
Reviewed-on: https://go-review.googlesource.com/18159Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 7e24e899
...@@ -124,10 +124,10 @@ func init1(n *Node, out **NodeList) { ...@@ -124,10 +124,10 @@ func init1(n *Node, out **NodeList) {
} }
case OAS2FUNC, OAS2MAPR, OAS2DOTTYPE, OAS2RECV: case OAS2FUNC, OAS2MAPR, OAS2DOTTYPE, OAS2RECV:
if defn.Initorder != InitNotStarted { if defn.Initorder == InitDone {
break break
} }
defn.Initorder = InitDone defn.Initorder = InitPending
for l := defn.Rlist; l != nil; l = l.Next { for l := defn.Rlist; l != nil; l = l.Next {
init1(l.N, out) init1(l.N, out)
} }
...@@ -135,6 +135,7 @@ func init1(n *Node, out **NodeList) { ...@@ -135,6 +135,7 @@ func init1(n *Node, out **NodeList) {
Dump("nonstatic", defn) Dump("nonstatic", defn)
} }
*out = list(*out, defn) *out = list(*out, defn)
defn.Initorder = InitDone
} }
} }
......
// 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() {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment