diff options
author | David Chase <drchase@google.com> | 2022-05-10 12:52:52 -0400 |
---|---|---|
committer | David Chase <drchase@google.com> | 2022-05-17 17:29:34 +0000 |
commit | cf5fa2b4a7b4325cf88a51c36b5fe37837e3a158 (patch) | |
tree | 0e7aa2779b21aee032a5d726086c2485a6108cfe | |
parent | 8ed0e51b5e5cc50985444f39dc56c55e4fa3bcf9 (diff) | |
download | go-cf5fa2b4a7b4325cf88a51c36b5fe37837e3a158.tar.gz go-cf5fa2b4a7b4325cf88a51c36b5fe37837e3a158.zip |
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.
Updates #52279.
Fixes #52286.
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>
(cherry picked from commit 1284cc24955487192fb7fb5aea934cb13fd1ae73)
Reviewed-on: https://go-review.googlesource.com/c/go/+/405543
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
-rw-r--r-- | src/cmd/compile/internal/typecheck/crawler.go | 4 | ||||
-rw-r--r-- | test/fixedbugs/issue52279.dir/lib.go | 23 | ||||
-rw-r--r-- | test/fixedbugs/issue52279.dir/main.go | 5 | ||||
-rw-r--r-- | test/fixedbugs/issue52279.go | 7 |
4 files changed, 38 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/typecheck/crawler.go b/src/cmd/compile/internal/typecheck/crawler.go index 40b518983a..f14d885564 100644 --- a/src/cmd/compile/internal/typecheck/crawler.go +++ b/src/cmd/compile/internal/typecheck/crawler.go @@ -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) } } diff --git a/test/fixedbugs/issue52279.dir/lib.go b/test/fixedbugs/issue52279.dir/lib.go new file mode 100644 index 0000000000..e20de30bd5 --- /dev/null +++ b/test/fixedbugs/issue52279.dir/lib.go @@ -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] +} diff --git a/test/fixedbugs/issue52279.dir/main.go b/test/fixedbugs/issue52279.dir/main.go new file mode 100644 index 0000000000..8c7e069c5b --- /dev/null +++ b/test/fixedbugs/issue52279.dir/main.go @@ -0,0 +1,5 @@ +package main + +import "./lib" + +func main() { lib.FIRST.String() } diff --git a/test/fixedbugs/issue52279.go b/test/fixedbugs/issue52279.go new file mode 100644 index 0000000000..642f4bf49f --- /dev/null +++ b/test/fixedbugs/issue52279.go @@ -0,0 +1,7 @@ +// rundir -G=3 + +// 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 |