| // 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. |
| |
| // Test to make sure RHS is evaluated before map insert is started. |
| // The RHS panics in all of these cases. |
| |
| package main |
| |
| import "fmt" |
| |
| func main() { |
| for i, f := range []func(map[int]int){ |
| f0, f1, f2, f3, f4, f5, f6, f7, f8, |
| } { |
| m := map[int]int{} |
| func() { // wrapper to scope the defer. |
| defer func() { |
| recover() |
| }() |
| f(m) // Will panic. Shouldn't modify m. |
| fmt.Printf("RHS didn't panic, case f%d\n", i) |
| }() |
| if len(m) != 0 { |
| fmt.Printf("map insert happened, case f%d\n", i) |
| } |
| } |
| |
| // Append slice. |
| for i, f := range []func(map[int][]int){ |
| fa0, fa1, fa2, fa3, |
| } { |
| m := map[int][]int{} |
| func() { // wrapper to scope the defer. |
| defer func() { |
| recover() |
| }() |
| f(m) // Will panic. Shouldn't modify m. |
| fmt.Printf("RHS didn't panic, case fa%d\n", i) |
| }() |
| if len(m) != 0 { |
| fmt.Printf("map insert happened, case fa%d\n", i) |
| } |
| } |
| } |
| |
| func f0(m map[int]int) { |
| var p *int |
| m[0] = *p |
| } |
| |
| func f1(m map[int]int) { |
| var p *int |
| m[0] += *p |
| } |
| |
| func f2(m map[int]int) { |
| var p *int |
| sink, m[0] = sink, *p |
| } |
| |
| func f3(m map[int]int) { |
| var p *chan int |
| m[0], sink = <-(*p) |
| } |
| |
| func f4(m map[int]int) { |
| var p *interface{} |
| m[0], sink = (*p).(int) |
| } |
| |
| func f5(m map[int]int) { |
| var p *map[int]int |
| m[0], sink = (*p)[0] |
| } |
| |
| func f6(m map[int]int) { |
| var z int |
| m[0] /= z |
| } |
| |
| func f7(m map[int]int) { |
| var a []int |
| m[0] = a[0] |
| } |
| |
| func f8(m map[int]int) { |
| var z int |
| m[0] %= z |
| } |
| |
| func fa0(m map[int][]int) { |
| var p *int |
| m[0] = append(m[0], *p) |
| } |
| |
| func fa1(m map[int][]int) { |
| var p *int |
| sink, m[0] = !sink, append(m[0], *p) |
| } |
| |
| func fa2(m map[int][]int) { |
| var p *int |
| m[0], _ = append(m[0], 0), *p |
| } |
| |
| func fa3(m map[int][]int) { |
| // OSLICE has similar in-place-reassignment |
| // optimizations as OAPPEND, but we need to make sure |
| // to *not* optimize them, because we can't guarantee |
| // the slice indices are within bounds. |
| m[0] = m[0][:1] |
| } |
| |
| var sink bool |