github.com/jd-ly/tools@v0.5.7/go/ssa/interp/testdata/initorder.go (about)

     1  package main
     2  
     3  import "fmt"
     4  
     5  // Test of initialization order of package-level vars.
     6  
     7  var counter int
     8  
     9  func next() int {
    10  	c := counter
    11  	counter++
    12  	return c
    13  }
    14  
    15  func next2() (x int, y int) {
    16  	x = next()
    17  	y = next()
    18  	return
    19  }
    20  
    21  func makeOrder() int {
    22  	_, _, _, _ = f, b, d, e
    23  	return 0
    24  }
    25  
    26  func 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{a, b, c, d, e, f}
    33  	if abcdef != [6]int{0, 1, 2, 3, 4, 5} {
    34  		panic(abcdef)
    35  	}
    36  }
    37  
    38  var order = makeOrder()
    39  
    40  var a, b = next(), next()
    41  var c, d = next2()
    42  var e, f = next(), next()
    43  
    44  // ------------------------------------------------------------------------
    45  
    46  var order2 []string
    47  
    48  func create(x int, name string) int {
    49  	order2 = append(order2, name)
    50  	return x
    51  }
    52  
    53  var C = create(B+1, "C")
    54  var A, B = create(1, "A"), create(2, "B")
    55  
    56  // Initialization order of package-level value specs.
    57  func 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  }