]> Cypherpunks repositories - gostls13.git/commitdiff
test: add test for package-scope method value GC
authorMatthew Dempsky <mdempsky@google.com>
Tue, 9 Aug 2022 05:00:09 +0000 (22:00 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 9 Aug 2022 16:41:51 +0000 (16:41 +0000)
The Go 1.18 frontend handles package-scope generic method values by
spilling the receiver value to a global temporary variable, which pins
it into memory. This issue isn't present in unified IR, which uses
OMETHVALUE when the receiver type is statically known.

Updates #54343.

Change-Id: I2c4ffeb125a3cf338f949a93b0baac75fff6cd31
Reviewed-on: https://go-review.googlesource.com/c/go/+/422198
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>

test/fixedbugs/issue54343.go [new file with mode: 0644]
test/run.go

diff --git a/test/fixedbugs/issue54343.go b/test/fixedbugs/issue54343.go
new file mode 100644 (file)
index 0000000..f8f73f4
--- /dev/null
@@ -0,0 +1,45 @@
+// run
+
+// Copyright 2022 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 "runtime"
+
+func main() {
+       if wait() {
+               panic("GC'd early")
+       }
+       m = nil
+       if !wait() {
+               panic("never GC'd")
+       }
+}
+
+var m = New[int]().M
+
+func New[X any]() *T[X] {
+       p := new(T[X])
+       runtime.SetFinalizer(p, func(*T[X]) { close(done) })
+       return p
+}
+
+type T[X any] int
+
+func (*T[X]) M() {}
+
+var done = make(chan int)
+
+func wait() bool {
+       for i := 0; i < 10; i++ {
+               runtime.GC()
+               select {
+               case <-done:
+                       return true
+               default:
+               }
+       }
+       return false
+}
index 4a992037615e43ca074adfec8a40f2bf8de59826..8c8c87a46d4428692d010d2720caedcb8c93a1c7 100644 (file)
@@ -1980,6 +1980,7 @@ var types2Failures32Bit = setOf(
 )
 
 var go118Failures = setOf(
+       "fixedbugs/issue54343.go",  // 1.18 compiler assigns receiver parameter to global variable
        "typeparam/nested.go",      // 1.18 compiler doesn't support function-local types with generics
        "typeparam/issue51521.go",  // 1.18 compiler produces bad panic message and link error
        "typeparam/mdempsky/16.go", // 1.18 compiler uses interface shape type in failed type assertions