aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2022-05-10 12:52:52 -0400
committerDavid Chase <drchase@google.com>2022-05-17 17:29:34 +0000
commitcf5fa2b4a7b4325cf88a51c36b5fe37837e3a158 (patch)
tree0e7aa2779b21aee032a5d726086c2485a6108cfe
parent8ed0e51b5e5cc50985444f39dc56c55e4fa3bcf9 (diff)
downloadgo-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.go4
-rw-r--r--test/fixedbugs/issue52279.dir/lib.go23
-rw-r--r--test/fixedbugs/issue52279.dir/main.go5
-rw-r--r--test/fixedbugs/issue52279.go7
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