aboutsummaryrefslogtreecommitdiff
path: root/go/ssa/sanity.go
diff options
context:
space:
mode:
authorTim King <taking@google.com>2021-09-22 09:50:15 -0700
committerTim King <taking@google.com>2022-04-22 17:17:20 +0000
commitd567bc1c220c9afb5f71dc38550ef8b0262ff544 (patch)
treebf728634567d86d32e86038077f80345d88b71c8 /go/ssa/sanity.go
parent5d7ca8a1b5bc80222ed6375e345ba8b6e24e9515 (diff)
downloadgolang-x-tools-d567bc1c220c9afb5f71dc38550ef8b0262ff544.tar.gz
go/ssa: monomorphize generic instantiations.
Monomorphize the instantiation of generic functions. Applies type substitution while building the function instantiation. Adds a new BuilderMode, ssa.InstantiateGenerics, to enable monomorphization. InstantiateGenerics is turned on by the flag 'G' in tools that specify the BuilderMode. Adds a parameterized field to Program to detect when a MethodValue is parameterized. Thunk creation creates new MethodExpr selections. Adds a new methodExpr type to construct a MethodExpr from outside of types, and selection interface to generalize a *methodExpr and *types.Selection. Tests x/tools/go/ssa/interp against the runnable examples in $GOROOT/test/typeparam/*.go. Some additional models to support files. Misc. cleanup: - adding (*canonizer).instantiateMethod to create a canonical representative of a method. - documenting builder.go - adding (*subster).types that applies type substitution to a list. Updates golang/go#48525 Change-Id: I885a4223900feaa3664e35caf8618d11ba16a2a7 Reviewed-on: https://go-review.googlesource.com/c/tools/+/356315 Reviewed-by: Dominik Honnef <dominik@honnef.co> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Zvonimir Pavlinovic <zpavlinovic@google.com> Run-TryBot: Tim King <taking@google.com> gopls-CI: kokoro <noreply+kokoro@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'go/ssa/sanity.go')
-rw-r--r--go/ssa/sanity.go11
1 files changed, 9 insertions, 2 deletions
diff --git a/go/ssa/sanity.go b/go/ssa/sanity.go
index ba08c41d6..7d7130275 100644
--- a/go/ssa/sanity.go
+++ b/go/ssa/sanity.go
@@ -402,6 +402,8 @@ func (s *sanity) checkFunction(fn *Function) bool {
// - check params match signature
// - check transient fields are nil
// - warn if any fn.Locals do not appear among block instructions.
+
+ // TODO(taking): Sanity check _Origin, _TypeParams, and _TypeArgs.
s.fn = fn
if fn.Prog == nil {
s.errorf("nil Prog")
@@ -418,14 +420,19 @@ func (s *sanity) checkFunction(fn *Function) bool {
strings.HasPrefix(fn.Synthetic, "bound ") ||
strings.HasPrefix(fn.Synthetic, "thunk ") ||
strings.HasSuffix(fn.name, "Error") ||
- strings.HasPrefix(fn.Synthetic, "instantiation") {
+ strings.HasPrefix(fn.Synthetic, "instantiation") ||
+ (fn.parent != nil && len(fn._TypeArgs) > 0) /* anon fun in instance */ {
// ok
} else {
s.errorf("nil Pkg")
}
}
if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn {
- s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
+ if strings.HasPrefix(fn.Synthetic, "instantiation") && fn.Prog.mode&InstantiateGenerics != 0 {
+ // ok
+ } else {
+ s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
+ }
}
for i, l := range fn.Locals {
if l.Parent() != fn {