// 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) }