diff options
Diffstat (limited to 'test/reorder.go')
-rw-r--r-- | test/reorder.go | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/test/reorder.go b/test/reorder.go new file mode 100644 index 0000000..57892f8 --- /dev/null +++ b/test/reorder.go @@ -0,0 +1,167 @@ +// run + +// Copyright 2011 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. + +// Test reordering of assignments. + +package main + +import "fmt" + +func main() { + p1() + p2() + p3() + p4() + p5() + p6() + p7() + p8() + p9() + p10() + p11() +} + +var gx []int + +func f(i int) int { + return gx[i] +} + +func check(x []int, x0, x1, x2 int) { + if x[0] != x0 || x[1] != x1 || x[2] != x2 { + fmt.Printf("%v, want %d,%d,%d\n", x, x0, x1, x2) + panic("failed") + } +} + +func check3(x, y, z, xx, yy, zz int) { + if x != xx || y != yy || z != zz { + fmt.Printf("%d,%d,%d, want %d,%d,%d\n", x, y, z, xx, yy, zz) + panic("failed") + } +} + +func p1() { + x := []int{1, 2, 3} + i := 0 + i, x[i] = 1, 100 + _ = i + check(x, 100, 2, 3) +} + +func p2() { + x := []int{1, 2, 3} + i := 0 + x[i], i = 100, 1 + _ = i + check(x, 100, 2, 3) +} + +func p3() { + x := []int{1, 2, 3} + y := x + gx = x + x[1], y[0] = f(0), f(1) + check(x, 2, 1, 3) +} + +func p4() { + x := []int{1, 2, 3} + y := x + gx = x + x[1], y[0] = gx[0], gx[1] + check(x, 2, 1, 3) +} + +func p5() { + x := []int{1, 2, 3} + y := x + p := &x[0] + q := &x[1] + *p, *q = x[1], y[0] + check(x, 2, 1, 3) +} + +func p6() { + x := 1 + y := 2 + z := 3 + px := &x + py := &y + *px, *py = y, x + check3(x, y, z, 2, 1, 3) +} + +func f1(x, y, z int) (xx, yy, zz int) { + return x, y, z +} + +func f2() (x, y, z int) { + return f1(2, 1, 3) +} + +func p7() { + x, y, z := f2() + check3(x, y, z, 2, 1, 3) +} + +func p8() { + m := make(map[int]int) + m[0] = len(m) + if m[0] != 0 { + panic(m[0]) + } +} + +// Issue #13433: Left-to-right assignment of OAS2XXX nodes. +func p9() { + var x bool + + // OAS2FUNC + x, x = fn() + checkOAS2XXX(x, "x, x = fn()") + + // OAS2RECV + var c = make(chan bool, 10) + c <- false + x, x = <-c + checkOAS2XXX(x, "x, x <-c") + + // OAS2MAPR + var m = map[int]bool{0: false} + x, x = m[0] + checkOAS2XXX(x, "x, x = m[0]") + + // OAS2DOTTYPE + var i interface{} = false + x, x = i.(bool) + checkOAS2XXX(x, "x, x = i.(bool)") +} + +//go:noinline +func fn() (bool, bool) { return false, true } + +// checks the order of OAS2XXX. +func checkOAS2XXX(x bool, s string) { + if !x { + fmt.Printf("%s; got=(false); want=(true)\n", s) + panic("failed") + } +} + +//go:noinline +func fp() (*int, int) { return nil, 42 } + +func p10() { + p := new(int) + p, *p = fp() +} + +func p11() { + var i interface{} + p := new(bool) + p, *p = i.(*bool) +} |