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