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