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