]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix reference to generic type needed by crawler
authorDan Scales <danscales@google.com>
Wed, 25 Aug 2021 00:35:51 +0000 (17:35 -0700)
committerDan Scales <danscales@google.com>
Thu, 26 Aug 2021 20:18:58 +0000 (20:18 +0000)
This problem happens when you create a new local type that uses an
imported generic type (maybe just by instantiating it), and then that
local type needed to be included as part of an export. In that case, the
imported generic type is does not have a declaration in the local
package, so it is not necessarily created in types1, so the
crawler/export doesn't work.

To fix this issue, we just need to add a call to g.obj() for the base
generic type, to make sure that it will exist if needed later in the
compilation or for the crawler during export.

Fixes #47514

Change-Id: Ie756578f07ad0007de8a88ae909cf7534a22936e
Reviewed-on: https://go-review.googlesource.com/c/go/+/345411
Reviewed-by: Keith Randall <khr@golang.org>
Trust: Dan Scales <danscales@google.com>

src/cmd/compile/internal/noder/types.go
test/typeparam/issue47514c.dir/a.go [new file with mode: 0644]
test/typeparam/issue47514c.dir/main.go [new file with mode: 0644]
test/typeparam/issue47514c.go [new file with mode: 0644]

index c9f7c2bbe478dca77aafb9afc9c0a0747bc644b6..a5a90aacaaffd0234d79a1363ec4355c6e72e8fc 100644 (file)
@@ -118,9 +118,14 @@ func (g *irgen) typ0(typ types2.Type) *types.Type {
                                return s.Def.Type()
                        }
 
+                       // Make sure the base generic type exists in type1 (it may
+                       // not yet if we are referecing an imported generic type, as
+                       // opposed to a generic type declared in this package).
+                       _ = g.obj(typ.Orig().Obj())
+
                        // Create a forwarding type first and put it in the g.typs
                        // map, in order to deal with recursive generic types
-                       // (including via method signatures).. Set up the extra
+                       // (including via method signatures). Set up the extra
                        // ntyp information (Def, RParams, which may set
                        // HasTParam) before translating the underlying type
                        // itself, so we handle recursion correctly.
diff --git a/test/typeparam/issue47514c.dir/a.go b/test/typeparam/issue47514c.dir/a.go
new file mode 100644 (file)
index 0000000..782b1d2
--- /dev/null
@@ -0,0 +1,5 @@
+package a
+
+type Doer[T any] interface {
+       Do() T
+}
diff --git a/test/typeparam/issue47514c.dir/main.go b/test/typeparam/issue47514c.dir/main.go
new file mode 100644 (file)
index 0000000..bc1166f
--- /dev/null
@@ -0,0 +1,10 @@
+package main
+
+import "a"
+
+func Do[T any](doer a.Doer[T]) {
+       doer.Do()
+}
+
+func main() {
+}
diff --git a/test/typeparam/issue47514c.go b/test/typeparam/issue47514c.go
new file mode 100644 (file)
index 0000000..76930e5
--- /dev/null
@@ -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