diff options
| author | Dan Scales <danscales@google.com> | 2021-08-29 06:49:28 -0700 |
|---|---|---|
| committer | Dan Scales <danscales@google.com> | 2021-08-30 21:22:35 +0000 |
| commit | 8f4c020660d4c8a7bab9a7363551d07176e638eb (patch) | |
| tree | 6492dead38203f0fe018b9853f60ef56b8398e34 /src/cmd/compile/internal/noder/expr.go | |
| parent | 8250141c9a506dee883b53473867b27e68ac10a4 (diff) | |
| download | go-8f4c020660d4c8a7bab9a7363551d07176e638eb.tar.xz | |
cmd/compile: fix bug with Inferred targs
We were using the type from the wrong Node (the partially filled-in
FUNCINST) rather than the original function node - which is pointed to
by the OFUNCINST)) to set the final fully-substituted type of the
OFUNCINST. So fixed the node reference. Also, added check so we don't do
any work at all if the OFUNCINST already has all type args filled in.
Added few extra cases to the test file issue48030.go, to cover
fully-specified type args, partially inferred type args, and fully
inferred type args.
Fixes #48030
Change-Id: If9e4f2e0514d68b9d241f30c423259133932b25b
Reviewed-on: https://go-review.googlesource.com/c/go/+/346229
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder/expr.go')
| -rw-r--r-- | src/cmd/compile/internal/noder/expr.go | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/cmd/compile/internal/noder/expr.go b/src/cmd/compile/internal/noder/expr.go index 0e5257d7cf..863acf587d 100644 --- a/src/cmd/compile/internal/noder/expr.go +++ b/src/cmd/compile/internal/noder/expr.go @@ -126,13 +126,15 @@ func (g *irgen) expr0(typ types2.Type, expr syntax.Expr) ir.Node { targs[i] = ir.TypeNode(g.typ(inferred.TArgs.At(i))) } if fun.Op() == ir.OFUNCINST { - // Replace explicit type args with the full list that - // includes the additional inferred type args. - // Substitute the type args for the type params in - // the generic function's type. - fun.(*ir.InstExpr).Targs = targs - newt := g.substType(fun.Type(), fun.Type().TParams(), targs) - typed(newt, fun) + if len(fun.(*ir.InstExpr).Targs) < len(targs) { + // Replace explicit type args with the full list that + // includes the additional inferred type args. + // Substitute the type args for the type params in + // the generic function's type. + fun.(*ir.InstExpr).Targs = targs + newt := g.substType(fun.(*ir.InstExpr).X.Type(), fun.(*ir.InstExpr).X.Type().TParams(), targs) + typed(newt, fun) + } } else { // Create a function instantiation here, given there // are only inferred type args (e.g. min(5,6), where |
