aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder/expr.go
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-03-09 18:24:51 -0800
committerDan Scales <danscales@google.com>2021-03-11 00:31:14 +0000
commitfdded79e6e3256118af182b42714d4d56f2000b0 (patch)
treef7014aedc7e02bd11a8770e3f2b916b86ffb10f6 /src/cmd/compile/internal/noder/expr.go
parent1bad3831a0afe76d3403f564e89be6b76f8c6d98 (diff)
downloadgo-fdded79e6e3256118af182b42714d4d56f2000b0.tar.xz
cmd/compile: fix handling of partially inferred type arguments
In the case of partially inferred type arguments, we need to use the IndexExpr as the key in g.info.Inferred[] rather than the CallExpr. Added an extra fromStrings1 call in the settable.go test that tests partially inferred type arguments. This new call uses a new concrete type SettableString as well. I also added another implementation fromStrings3 (derived from a go2go tests) that typechecks but intentionally causes a panic. Change-Id: I74d35c5a741f72f37160a96fbec939451157f392 Reviewed-on: https://go-review.googlesource.com/c/go/+/300309 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Dan Scales <danscales@google.com> Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder/expr.go')
-rw-r--r--src/cmd/compile/internal/noder/expr.go12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/noder/expr.go b/src/cmd/compile/internal/noder/expr.go
index b99f5a4cdd..06aa91199c 100644
--- a/src/cmd/compile/internal/noder/expr.go
+++ b/src/cmd/compile/internal/noder/expr.go
@@ -96,7 +96,17 @@ func (g *irgen) expr0(typ types2.Type, expr syntax.Expr) ir.Node {
case *syntax.CallExpr:
fun := g.expr(expr.Fun)
- if inferred, ok := g.info.Inferred[expr]; ok && len(inferred.Targs) > 0 {
+
+ // The key for the Inferred map is usually the expr.
+ key := syntax.Expr(expr)
+ if _, ok := expr.Fun.(*syntax.IndexExpr); ok {
+ // If the Fun is an IndexExpr, then this may be a
+ // partial type inference case. In this case, we look up
+ // the IndexExpr in the Inferred map.
+ // TODO(gri): should types2 always record the callExpr as the key?
+ key = syntax.Expr(expr.Fun)
+ }
+ if inferred, ok := g.info.Inferred[key]; ok && len(inferred.Targs) > 0 {
targs := make([]ir.Node, len(inferred.Targs))
for i, targ := range inferred.Targs {
targs[i] = ir.TypeNode(g.typ(targ))