modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/fixedbugs/issue22881.go (about)

     1  // run
     2  
     3  // Copyright 2017 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test to make sure RHS is evaluated before map insert is started.
     8  // The RHS panics in all of these cases.
     9  
    10  package main
    11  
    12  import "fmt"
    13  
    14  func main() {
    15  	for i, f := range []func(map[int]int){
    16  		f0, f1, f2, f3, f4, f5, f6, f7,
    17  	} {
    18  		m := map[int]int{}
    19  		func() { // wrapper to scope the defer.
    20  			defer func() {
    21  				recover()
    22  			}()
    23  			f(m) // Will panic. Shouldn't modify m.
    24  			fmt.Printf("RHS didn't panic, case f%d\n", i)
    25  		}()
    26  		if len(m) != 0 {
    27  			fmt.Printf("map insert happened, case f%d\n", i)
    28  		}
    29  	}
    30  }
    31  
    32  func f0(m map[int]int) {
    33  	var p *int
    34  	m[0] = *p
    35  }
    36  
    37  func f1(m map[int]int) {
    38  	var p *int
    39  	m[0] += *p
    40  }
    41  
    42  func f2(m map[int]int) {
    43  	var p *int
    44  	sink, m[0] = sink, *p
    45  }
    46  
    47  func f3(m map[int]int) {
    48  	var p *chan int
    49  	m[0], sink = <-(*p)
    50  }
    51  
    52  func f4(m map[int]int) {
    53  	var p *interface{}
    54  	m[0], sink = (*p).(int)
    55  }
    56  
    57  func f5(m map[int]int) {
    58  	var p *map[int]int
    59  	m[0], sink = (*p)[0]
    60  }
    61  
    62  func f6(m map[int]int) {
    63  	var z int
    64  	m[0] /= z
    65  }
    66  
    67  func f7(m map[int]int) {
    68  	var a []int
    69  	m[0] = a[0]
    70  }
    71  
    72  var sink bool