summaryrefslogtreecommitdiffstats
path: root/test/fixedbugs/issue59411.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/fixedbugs/issue59411.go')
-rw-r--r--test/fixedbugs/issue59411.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/test/fixedbugs/issue59411.go b/test/fixedbugs/issue59411.go
new file mode 100644
index 0000000..fc35c98
--- /dev/null
+++ b/test/fixedbugs/issue59411.go
@@ -0,0 +1,77 @@
+// 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")
+ }
+}