// run // Copyright 2020 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. // assignment order in multiple assignments. // See issue #23017 package main import "fmt" func main() {} func init() { var m = map[int]int{} var p *int defer func() { recover() check(1, len(m)) check(42, m[2]) }() m[2], *p = 42, 2 } func init() { var m = map[int]int{} p := []int{} defer func() { recover() check(1, len(m)) check(2, m[2]) }() m[2], p[1] = 2, 2 } func init() { type P struct{ i int } var m = map[int]int{} var p *P defer func() { recover() check(1, len(m)) check(3, m[2]) }() m[2], p.i = 3, 2 } func init() { type T struct{ i int } var x T p := &x p, p.i = new(T), 4 check(4, x.i) } func init() { var m map[int]int var a int var p = &a defer func() { recover() check(5, *p) }() *p, m[2] = 5, 2 } var g int func init() { var m map[int]int defer func() { recover() check(0, g) }() m[0], g = 1, 2 } func init() { type T struct{ x struct{ y int } } var x T p := &x p, p.x.y = new(T), 7 check(7, x.x.y) check(0, p.x.y) } func init() { type T *struct{ x struct{ y int } } x := struct{ y int }{0} var q T = &struct{ x struct{ y int } }{x} p := q p, p.x.y = nil, 7 check(7, q.x.y) } func init() { x, y := 1, 2 x, y = y, x check(2, x) check(1, y) } func check(want, got int) { if want != got { panic(fmt.Sprintf("wanted %d, but got %d", want, got)) } }