// 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() }