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