mirror of
https://github.com/golang/go
synced 2024-11-26 21:21:34 -07:00
cmd/compile: ensure generic function is loaded when it needs to be re-exported
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>
This commit is contained in:
parent
d2f4c935f2
commit
be18cd51de
@ -1418,6 +1418,12 @@ func (w *exportWriter) funcExt(n *ir.Name) {
|
|||||||
w.uint64(1 + uint64(n.Func.Inl.Cost))
|
w.uint64(1 + uint64(n.Func.Inl.Cost))
|
||||||
w.bool(n.Func.Inl.CanDelayResults)
|
w.bool(n.Func.Inl.CanDelayResults)
|
||||||
if n.Func.ExportInline() || n.Type().HasTParam() {
|
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)
|
w.p.doInline(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
test/typeparam/issue49667.dir/a.go
Normal file
12
test/typeparam/issue49667.dir/a.go
Normal file
@ -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
|
||||||
|
}
|
11
test/typeparam/issue49667.dir/b.go
Normal file
11
test/typeparam/issue49667.dir/b.go
Normal file
@ -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]
|
||||||
|
}
|
11
test/typeparam/issue49667.dir/main.go
Normal file
11
test/typeparam/issue49667.dir/main.go
Normal file
@ -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]
|
||||||
|
}
|
7
test/typeparam/issue49667.go
Normal file
7
test/typeparam/issue49667.go
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user