| // run | |
| // Copyright 2017 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. | |
| // Issue 21687: cmd/compile evaluates x twice in "x op= y", which was | |
| // detectable if evaluating y affects x. | |
| package main | |
| func ptrs() (int, int) { | |
| one := 1 | |
| two := 2 | |
| x := &one | |
| *x += func() int { | |
| x = &two | |
| return 0 | |
| }() | |
| return one, two | |
| } | |
| func slices() (int, int) { | |
| one := []int{1} | |
| two := []int{2} | |
| x := one | |
| x[0] += func() int { | |
| x = two | |
| return 0 | |
| }() | |
| return one[0], two[0] | |
| } | |
| func maps() (int, int) { | |
| one := map[int]int{0: 1} | |
| two := map[int]int{0: 2} | |
| x := one | |
| x[0] += func() int { | |
| x = two | |
| return 0 | |
| }() | |
| return one[0], two[0] | |
| } | |
| var tests = [...]func() (int, int){ | |
| ptrs, | |
| slices, | |
| maps, | |
| } | |
| func main() { | |
| bad := 0 | |
| for i, f := range tests { | |
| if a, b := f(); a+b != 3 { | |
| println(i, a, b) | |
| bad++ | |
| } | |
| } | |
| if bad != 0 { | |
| panic(bad) | |
| } | |
| } |