You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
1.5 KiB
90 lines
1.5 KiB
// 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()
|
|
}
|