summaryrefslogtreecommitdiffstats
path: root/test/fixedbugs/issue45045.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/fixedbugs/issue45045.go')
-rw-r--r--test/fixedbugs/issue45045.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/test/fixedbugs/issue45045.go b/test/fixedbugs/issue45045.go
new file mode 100644
index 0000000..6e6db64
--- /dev/null
+++ b/test/fixedbugs/issue45045.go
@@ -0,0 +1,51 @@
+// run
+
+// Copyright 2021 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 (
+ "reflect"
+ "runtime"
+ "unsafe"
+)
+
+func k(c chan string, val string) string {
+ b := make([]byte, 1000)
+ runtime.SetFinalizer(&b[0], func(*byte) {
+ c <- val
+ })
+ var s string
+ h := (*reflect.StringHeader)(unsafe.Pointer(&s))
+ h.Data = uintptr(unsafe.Pointer(&b[0]))
+ h.Len = len(b)
+ return s
+}
+
+func main() {
+ {
+ c := make(chan string, 2)
+ m := make(map[string]int)
+ m[k(c, "first")] = 0
+ m[k(c, "second")] = 0
+ runtime.GC()
+ if s := <-c; s != "first" {
+ panic("map[string], second key did not retain.")
+ }
+ runtime.KeepAlive(m)
+ }
+
+ {
+ c := make(chan string, 2)
+ m := make(map[[2]string]int)
+ m[[2]string{k(c, "first")}] = 0
+ m[[2]string{k(c, "second")}] = 0
+ runtime.GC()
+ if s := <-c; s != "first" {
+ panic("map[[2]string], second key did not retain.")
+ }
+ runtime.KeepAlive(m)
+ }
+}