]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: mark closures made for generic function expressions as wrappers
authorKeith Randall <khr@golang.org>
Thu, 26 May 2022 18:33:09 +0000 (11:33 -0700)
committerKeith Randall <khr@golang.org>
Thu, 26 May 2022 21:06:31 +0000 (21:06 +0000)
Fixes #52237

Change-Id: I7488020c8d157e069202017a293d18230e3aef0d
Reviewed-on: https://go-review.googlesource.com/c/go/+/408876
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
src/cmd/compile/internal/noder/stencil.go
src/testing/helper_test.go
src/testing/helperfuncs_test.go

index a986b0804148e81645aaf88b1911c3fe0142d0c0..88e49616668d98b8f78ec0baa81a6f4ec0efcabc 100644 (file)
@@ -407,6 +407,7 @@ func (g *genInst) buildClosure(outer *ir.Func, x ir.Node) ir.Node {
 
        // Make a new internal function.
        fn, formalParams, formalResults := startClosure(pos, outer, typ)
+       fn.SetWrapper(true) // See issue 52237
 
        // This is the dictionary we want to use.
        // It may be a constant, it may be the outer functions's dictionary, or it may be
index 6175410f18a7c276f456c70f7848d7343b1ec52f..357a0798a1222668d3a95f9edc8d9832334076bf 100644 (file)
@@ -24,20 +24,22 @@ func TestTBHelper(t *T) {
 
        want := `--- FAIL: Test (?s)
 helperfuncs_test.go:12: 0
-helperfuncs_test.go:33: 1
+helperfuncs_test.go:40: 1
 helperfuncs_test.go:21: 2
-helperfuncs_test.go:35: 3
-helperfuncs_test.go:42: 4
+helperfuncs_test.go:42: 3
+helperfuncs_test.go:49: 4
 --- FAIL: Test/sub (?s)
-helperfuncs_test.go:45: 5
+helperfuncs_test.go:52: 5
 helperfuncs_test.go:21: 6
-helperfuncs_test.go:44: 7
-helperfuncs_test.go:56: 8
+helperfuncs_test.go:51: 7
+helperfuncs_test.go:63: 8
 --- FAIL: Test/sub2 (?s)
-helperfuncs_test.go:71: 11
-helperfuncs_test.go:75: recover 12
-helperfuncs_test.go:64: 9
-helperfuncs_test.go:60: 10
+helperfuncs_test.go:78: 11
+helperfuncs_test.go:82: recover 12
+helperfuncs_test.go:84: GenericFloat64
+helperfuncs_test.go:85: GenericInt
+helperfuncs_test.go:71: 9
+helperfuncs_test.go:67: 10
 `
        lines := strings.Split(buf.String(), "\n")
        durationRE := regexp.MustCompile(`\(.*\)$`)
index 272b33c0e5095ba2712324749821867e133c2c40..b63bc91ac20f07e6cb3f666fee5feab1675c5285 100644 (file)
@@ -26,6 +26,13 @@ func helperCallingHelper(t *T, msg string) {
        helper(t, msg)
 }
 
+func genericHelper[G any](t *T, msg string) {
+       t.Helper()
+       t.Error(msg)
+}
+
+var genericIntHelper = genericHelper[int]
+
 func testHelper(t *T) {
        // Check combinations of directly and indirectly
        // calling helper functions.
@@ -73,6 +80,9 @@ func testHelper(t *T) {
        // Check that helper-ness propagates up through panic/recover.
        // See https://golang.org/issue/31154.
        recoverHelper(t, "12")
+
+       genericHelper[float64](t, "GenericFloat64")
+       genericIntHelper(t, "GenericInt")
 }
 
 func parallelTestHelper(t *T) {