]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: ensure generic function is loaded when it needs to be re-exported
authorDan Scales <danscales@google.com>
Fri, 19 Nov 2021 20:13:04 +0000 (12:13 -0800)
committerDan Scales <danscales@google.com>
Sat, 20 Nov 2021 01:00:16 +0000 (01:00 +0000)
In the case where we need to re-export a generic function/method from
another package in the export data of the current package, make sure it
is loaded before trying to write it out.

Fixed #49667

Change-Id: I177754bb762689f34cf5c8ad246d43f1cdbbf195
Reviewed-on: https://go-review.googlesource.com/c/go/+/365837
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/typecheck/iexport.go
test/typeparam/issue49667.dir/a.go [new file with mode: 0644]
test/typeparam/issue49667.dir/b.go [new file with mode: 0644]
test/typeparam/issue49667.dir/main.go [new file with mode: 0644]
test/typeparam/issue49667.go [new file with mode: 0644]

index bf12ba803b7f4803e4718c9f6ee7e6b5b8b0332f..9bd1f626fe55ac310769340da43face3ad80bb1b 100644 (file)
@@ -1418,6 +1418,12 @@ func (w *exportWriter) funcExt(n *ir.Name) {
                w.uint64(1 + uint64(n.Func.Inl.Cost))
                w.bool(n.Func.Inl.CanDelayResults)
                if n.Func.ExportInline() || n.Type().HasTParam() {
+                       if n.Type().HasTParam() {
+                               // If this generic function/method is from another
+                               // package, but we didn't use for instantiation in
+                               // this package, we may not yet have imported it.
+                               ImportedBody(n.Func)
+                       }
                        w.p.doInline(n)
                }
 
diff --git a/test/typeparam/issue49667.dir/a.go b/test/typeparam/issue49667.dir/a.go
new file mode 100644 (file)
index 0000000..3b1889f
--- /dev/null
@@ -0,0 +1,12 @@
+// 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 a
+
+type A[T any] struct {
+}
+
+func (a A[T]) F() {
+       _ = a
+}
diff --git a/test/typeparam/issue49667.dir/b.go b/test/typeparam/issue49667.dir/b.go
new file mode 100644 (file)
index 0000000..e7f781e
--- /dev/null
@@ -0,0 +1,11 @@
+// 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 b
+
+import "a"
+
+type B[T any] struct {
+       _ a.A[T]
+}
diff --git a/test/typeparam/issue49667.dir/main.go b/test/typeparam/issue49667.dir/main.go
new file mode 100644 (file)
index 0000000..fccefe0
--- /dev/null
@@ -0,0 +1,11 @@
+// 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 "b"
+
+func main() {
+       var _ b.B[int]
+}
diff --git a/test/typeparam/issue49667.go b/test/typeparam/issue49667.go
new file mode 100644 (file)
index 0000000..76930e5
--- /dev/null
@@ -0,0 +1,7 @@
+// rundir -G=3
+
+// 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 ignored