aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/typecheck/crawler.go
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-06-04 15:22:55 -0700
committerDan Scales <danscales@google.com>2021-06-07 22:44:30 +0000
commit74d46381b2003f7d77bbe6eb4a8a31cb6f753a09 (patch)
tree73d8f425a530ed86b93d22b94499b145300fc5c7 /src/cmd/compile/internal/typecheck/crawler.go
parentccfb0ce8df980599750db4fa56a8ab16202f1ba6 (diff)
downloadgo-74d46381b2003f7d77bbe6eb4a8a31cb6f753a09.tar.gz
go-74d46381b2003f7d77bbe6eb4a8a31cb6f753a09.zip
[dev.typeparams] cmd/compile: do extra markObjects during iexport to deal with generics
markInlBody/markObject/markType don't fully work as they stand for generic functions/methods, since markInlBody can't understand method calls on generic types. Those method calls will be resolved to concrete methods in a full instantiation, but markInlBody on a generic function/method can't understand those method calls. So, we won't necessarily cause export of the appropriate extra method/function bodies needed for inlining in an instantiated function. One way to do this is just to make sure that we call markType on all generic types that are exported (whether explicitly exported via a capitalized name or unexported types that are referenced by a generic function body). That way, we will call markInlBody on all possible generic methods that might be called. Fixes the current problem for i386-softfloat builds on dev.typeparams. Change-Id: I2d3625d26042296731bd3c44ba1938aa194d527e Reviewed-on: https://go-review.googlesource.com/c/go/+/325329 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Trust: Dan Scales <danscales@google.com>
Diffstat (limited to 'src/cmd/compile/internal/typecheck/crawler.go')
-rw-r--r--src/cmd/compile/internal/typecheck/crawler.go17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/typecheck/crawler.go b/src/cmd/compile/internal/typecheck/crawler.go
index 48fc61dbfd..c78a604a8d 100644
--- a/src/cmd/compile/internal/typecheck/crawler.go
+++ b/src/cmd/compile/internal/typecheck/crawler.go
@@ -146,7 +146,9 @@ func (p *crawler) markInlBody(n *ir.Name) {
case ir.PEXTERN:
Export(n)
}
-
+ p.checkGenericType(n.Type())
+ case ir.OTYPE:
+ p.checkGenericType(n.Type())
case ir.OCALLPART:
// Okay, because we don't yet inline indirect
// calls to method values.
@@ -162,3 +164,16 @@ func (p *crawler) markInlBody(n *ir.Name) {
// because after inlining they might be callable.
ir.VisitList(fn.Inl.Body, doFlood)
}
+
+// checkGenerictype ensures that we call markType() on any base generic type that
+// is written to the export file (even if not explicitly marked
+// for export), so its methods will be available for inlining if needed.
+func (p *crawler) checkGenericType(t *types.Type) {
+ if t != nil && t.HasTParam() {
+ if t.OrigSym != nil {
+ // Convert to the base generic type.
+ t = t.OrigSym.Def.Type()
+ }
+ p.markType(t)
+ }
+}