diff options
author | Tim King <taking@google.com> | 2021-09-22 09:50:15 -0700 |
---|---|---|
committer | Tim King <taking@google.com> | 2022-04-22 17:17:20 +0000 |
commit | d567bc1c220c9afb5f71dc38550ef8b0262ff544 (patch) | |
tree | bf728634567d86d32e86038077f80345d88b71c8 /go/ssa/sanity.go | |
parent | 5d7ca8a1b5bc80222ed6375e345ba8b6e24e9515 (diff) | |
download | golang-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.go | 11 |
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 { |