.gitignore added
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.1.1-0.20210319172145-bda8f5cee399 / go / ssa / interp / testdata / initorder.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.1-0.20210319172145-bda8f5cee399/go/ssa/interp/testdata/initorder.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.1-0.20210319172145-bda8f5cee399/go/ssa/interp/testdata/initorder.go
new file mode 100644 (file)
index 0000000..0f26bed
--- /dev/null
@@ -0,0 +1,67 @@
+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)
+       }
+}