GoPLS Viewer

Home|gopls/go/ssa/interp/testdata/initorder.go
1package main
2
3import "fmt"
4
5// Test of initialization order of package-level vars.
6
7var counter int
8
9func next() int {
10    c := counter
11    counter++
12    return c
13}
14
15func next2() (x inty int) {
16    x = next()
17    y = next()
18    return
19}
20
21func makeOrder() int {
22    ____ = fbde
23    return 0
24}
25
26func main() {
27    // Initialization constraints:
28    // - {f,b,c/d,e} < order  (ref graph traversal)
29    // - order < {a}          (lexical order)
30    // - b < c/d < e < f      (lexical order)
31    // Solution: a b c/d e f
32    abcdef := [6]int{abcdef}
33    if abcdef != [6]int{012345} {
34        panic(abcdef)
35    }
36}
37
38var order = makeOrder()
39
40var ab = next(), next()
41var cd = next2()
42var ef = next(), next()
43
44// ------------------------------------------------------------------------
45
46var order2 []string
47
48func create(x intname stringint {
49    order2 = append(order2name)
50    return x
51}
52
53var C = create(B+1"C")
54var AB = create(1"A"), create(2"B")
55
56// Initialization order of package-level value specs.
57func init() {
58    x := fmt.Sprint(order2)
59    // Result varies by toolchain.  This is a spec bug.
60    if x != "[B C A]" && // gc
61        x != "[A B C]" { // go/types
62        panic(x)
63    }
64    if C != 3 {
65        panic(c)
66    }
67}
68
MembersX
next.c
next2.x
makeOrder
create.x
create.name
create
next
next2
next2.y
main.BlockStmt.abcdef
order2
Members
X