// 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, } { 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) } } } 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] } var sink bool