mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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>
This commit is contained in:
parent
1bad3831a0
commit
fdded79e6e
2 changed files with 61 additions and 6 deletions
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue