cmd/compile: be sure to export types mentioned in f.i.g. method signature

When a fully instantiated generic method is exported, be sure to also
export the types in its signature.

Fixes #52279.

Change-Id: Icc6bca05b01f914cf67faaf1bf184eaa5484f521
Reviewed-on: https://go-review.googlesource.com/c/go/+/405118
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
David Chase 2022-05-10 12:52:52 -04:00
parent 508cb32d4b
commit 1284cc2495
4 changed files with 38 additions and 1 deletions

View file

@ -234,7 +234,7 @@ func (p *crawler) checkForFullyInst(t *types.Type) {
for i, t1 := range t.RParams() {
shapes[i] = Shapify(t1, i, baseType.RParams()[i])
}
for j := range t.Methods().Slice() {
for j, tmethod := range t.Methods().Slice() {
baseNname := baseType.Methods().Slice()[j].Nname.(*ir.Name)
dictsym := MakeDictSym(baseNname.Sym(), t.RParams(), true)
if dictsym.Def == nil {
@ -255,6 +255,8 @@ func (p *crawler) checkForFullyInst(t *types.Type) {
ImportedBody(methNode.Func)
methNode.Func.SetExportInline(true)
}
// Make sure that any associated types are also exported. (See #52279)
p.checkForFullyInst(tmethod.Type)
}
}

View file

@ -0,0 +1,23 @@
package lib
type FMap[K comparable, V comparable] map[K]V
//go:noinline
func (m FMap[K, V]) Flip() FMap[V, K] {
out := make(FMap[V, K])
return out
}
type MyType uint8
const (
FIRST MyType = 0
)
var typeStrs = FMap[MyType, string]{
FIRST: "FIRST",
}
func (self MyType) String() string {
return typeStrs[self]
}

View file

@ -0,0 +1,5 @@
package main
import "./lib"
func main() { lib.FIRST.String() }

View file

@ -0,0 +1,7 @@
// rundir
// 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 ignored