| // run |
| |
| // Copyright 2023 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. |
| |
| package main |
| |
| import ( |
| "math" |
| "reflect" |
| ) |
| |
| func main() { |
| for i := 0; i < 100; i++ { |
| f() |
| g() |
| } |
| } |
| |
| func f() { |
| // Allocate map. |
| m := map[float64]int{} |
| // Fill to just before a growth trigger. |
| const N = 13 << 4 // 6.5 * 2 * 2^k |
| for i := 0; i < N; i++ { |
| m[math.NaN()] = i |
| } |
| // Trigger growth. |
| m[math.NaN()] = N |
| |
| // Iterate through map. |
| i := 0 |
| for range m { |
| if i == 6 { |
| // Partway through iteration, clear the map. |
| clear(m) |
| } else if i > 6 { |
| // If we advance to the next iteration, that's a bug. |
| panic("BAD") |
| } |
| i++ |
| } |
| if len(m) != 0 { |
| panic("clear did not empty the map") |
| } |
| } |
| |
| func g() { |
| // Allocate map. |
| m := map[float64]int{} |
| // Fill to just before a growth trigger. |
| const N = 13 << 4 // 6.5 * 2 * 2^k |
| for i := 0; i < N; i++ { |
| m[math.NaN()] = i |
| } |
| // Trigger growth. |
| m[math.NaN()] = N |
| |
| // Iterate through map. |
| i := 0 |
| v := reflect.ValueOf(m) |
| iter := v.MapRange() |
| for iter.Next() { |
| if i == 6 { |
| // Partway through iteration, clear the map. |
| v.Clear() |
| } else if i > 6 { |
| // If we advance to the next iteration, that's a bug. |
| panic("BAD") |
| } |
| i++ |
| } |
| if v.Len() != 0 { |
| panic("clear did not empty the map") |
| } |
| } |