Home | History | Annotate | Download | only in fixedbugs
      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 }
     72