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