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