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