modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/fixedbugs/issue5373.go (about) 1 // run 2 3 // Copyright 2015 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 // Ensure that zeroing range loops have the requisite side-effects. 8 9 package main 10 11 import ( 12 "fmt" 13 "os" 14 ) 15 16 func check(n int) { 17 // When n == 0, i is untouched by the range loop. 18 // Picking an initial value of -1 for i makes the 19 // "want" calculation below correct in all cases. 20 i := -1 21 s := make([]byte, n) 22 for i = range s { 23 s[i] = 0 24 } 25 if want := n - 1; i != want { 26 fmt.Printf("index after range with side-effect = %d want %d\n", i, want) 27 os.Exit(1) 28 } 29 30 i = n + 1 31 // i is shadowed here, so its value should be unchanged. 32 for i := range s { 33 s[i] = 0 34 } 35 if want := n + 1; i != want { 36 fmt.Printf("index after range without side-effect = %d want %d\n", i, want) 37 os.Exit(1) 38 } 39 40 // Index variable whose evaluation has side-effects 41 var x int 42 f := func() int { 43 x++ 44 return 0 45 } 46 var a [1]int 47 for a[f()] = range s { 48 s[a[f()]] = 0 49 } 50 if want := n * 2; x != want { 51 fmt.Printf("index function calls = %d want %d\n", x, want) 52 os.Exit(1) 53 } 54 55 // Range expression whose evaluation has side-effects 56 x = 0 57 b := [1][]byte{s} 58 for i := range b[f()] { 59 b[f()][i] = 0 60 } 61 if want := n + 1; x != n+1 { 62 fmt.Printf("range expr function calls = %d want %d\n", x, want) 63 os.Exit(1) 64 } 65 } 66 67 func main() { 68 check(0) 69 check(1) 70 check(15) 71 }