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