--- /dev/null
+package main
+
+import "fmt"
+
+// Test of initialization order of package-level vars.
+
+var counter int
+
+func next() int {
+ c := counter
+ counter++
+ return c
+}
+
+func next2() (x int, y int) {
+ x = next()
+ y = next()
+ return
+}
+
+func makeOrder() int {
+ _, _, _, _ = f, b, d, e
+ return 0
+}
+
+func main() {
+ // Initialization constraints:
+ // - {f,b,c/d,e} < order (ref graph traversal)
+ // - order < {a} (lexical order)
+ // - b < c/d < e < f (lexical order)
+ // Solution: a b c/d e f
+ abcdef := [6]int{a, b, c, d, e, f}
+ if abcdef != [6]int{0, 1, 2, 3, 4, 5} {
+ panic(abcdef)
+ }
+}
+
+var order = makeOrder()
+
+var a, b = next(), next()
+var c, d = next2()
+var e, f = next(), next()
+
+// ------------------------------------------------------------------------
+
+var order2 []string
+
+func create(x int, name string) int {
+ order2 = append(order2, name)
+ return x
+}
+
+var C = create(B+1, "C")
+var A, B = create(1, "A"), create(2, "B")
+
+// Initialization order of package-level value specs.
+func init() {
+ x := fmt.Sprint(order2)
+ // Result varies by toolchain. This is a spec bug.
+ if x != "[B C A]" && // gc
+ x != "[A B C]" { // go/types
+ panic(x)
+ }
+ if C != 3 {
+ panic(c)
+ }
+}