blob: a29f30da743e77cb43f92f9af58eb5def6e41756 [file] [log] [blame]
// run
// Copyright 2018 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.
// Ensure that range loops over maps with delete statements
// have the requisite side-effects.
package main
import (
"fmt"
"os"
)
func checkcleared() {
m := make(map[byte]int)
m[1] = 1
m[2] = 2
for k := range m {
delete(m, k)
}
l := len(m)
if want := 0; l != want {
fmt.Printf("len after map clear = %d want %d\n", l, want)
os.Exit(1)
}
m[0] = 0 // To have non empty map and avoid internal map code fast paths.
n := 0
for range m {
n++
}
if want := 1; n != want {
fmt.Printf("number of keys found = %d want %d\n", n, want)
os.Exit(1)
}
}
func checkloopvars() {
k := 0
m := make(map[int]int)
m[42] = 0
for k = range m {
delete(m, k)
}
if want := 42; k != want {
fmt.Printf("var after range with side-effect = %d want %d\n", k, want)
os.Exit(1)
}
}
func checksideeffects() {
var x int
f := func() int {
x++
return 0
}
m := make(map[int]int)
m[0] = 0
m[1] = 1
for k := range m {
delete(m, k+f())
}
if want := 2; x != want {
fmt.Printf("var after range with side-effect = %d want %d\n", x, want)
os.Exit(1)
}
var n int
m = make(map[int]int)
m[0] = 0
m[1] = 1
for k := range m {
delete(m, k)
n++
}
if want := 2; n != want {
fmt.Printf("counter for range with side-effect = %d want %d\n", n, want)
os.Exit(1)
}
}
func main() {
checkcleared()
checkloopvars()
checksideeffects()
}