]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: be sure to export types mentioned in f.i.g. method signature
authorDavid Chase <drchase@google.com>
Tue, 10 May 2022 16:52:52 +0000 (12:52 -0400)
committerDavid Chase <drchase@google.com>
Tue, 17 May 2022 17:29:34 +0000 (17:29 +0000)
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>
src/cmd/compile/internal/typecheck/crawler.go
test/fixedbugs/issue52279.dir/lib.go [new file with mode: 0644]
test/fixedbugs/issue52279.dir/main.go [new file with mode: 0644]
test/fixedbugs/issue52279.go [new file with mode: 0644]

index 40b518983a87054760473565e2a63ba1f16f0d3c..f14d885564230b4345c8da85591915a454289b15 100644 (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)
                }
        }
 
diff --git a/test/fixedbugs/issue52279.dir/lib.go b/test/fixedbugs/issue52279.dir/lib.go
new file mode 100644 (file)
index 0000000..e20de30
--- /dev/null
@@ -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 (file)
index 0000000..8c7e069
--- /dev/null
@@ -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 (file)
index 0000000..642f4bf
--- /dev/null
@@ -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