From: Robert Griesemer Date: Tue, 5 Oct 2021 00:44:56 +0000 (-0700) Subject: cmd/compile/internal/types2: update the recorded function type after inference X-Git-Tag: go1.18beta1~1052 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5140ad104b03f6c119beb7e74546fb53bf40b66d;p=gostls13.git cmd/compile/internal/types2: update the recorded function type after inference This is a clean port of CL 353831 from go/types to types2. For #47916. Change-Id: I2c2b9c7bbcd416fb21f3032c55a06406bad9334a Reviewed-on: https://go-review.googlesource.com/c/go/+/353934 Trust: Robert Griesemer Run-TryBot: Robert Griesemer TryBot-Result: Go Bot Reviewed-by: Robert Findley --- diff --git a/src/cmd/compile/internal/types2/api_test.go b/src/cmd/compile/internal/types2/api_test.go index ca81620a78..4966848ed4 100644 --- a/src/cmd/compile/internal/types2/api_test.go +++ b/src/cmd/compile/internal/types2/api_test.go @@ -328,8 +328,10 @@ func TestTypesInfo(t *testing.T) { // parameterized functions {genericPkg + `p0; func f[T any](T) {}; var _ = f[int]`, `f`, `func[generic_p0.T₁ interface{}](generic_p0.T₁)`}, {genericPkg + `p1; func f[T any](T) {}; var _ = f[int]`, `f[int]`, `func(int)`}, - {genericPkg + `p2; func f[T any](T) {}; func _() { f(42) }`, `f`, `func[generic_p2.T₁ interface{}](generic_p2.T₁)`}, - {genericPkg + `p3; func f[T any](T) {}; func _() { f(42) }`, `f(42)`, `()`}, + {genericPkg + `p2; func f[T any](T) {}; func _() { f(42) }`, `f`, `func(int)`}, + {genericPkg + `p3; func f[T any](T) {}; func _() { f[int](42) }`, `f[int]`, `func(int)`}, + {genericPkg + `p4; func f[T any](T) {}; func _() { f[int](42) }`, `f`, `func[generic_p4.T₁ interface{}](generic_p4.T₁)`}, + {genericPkg + `p5; func f[T any](T) {}; func _() { f(42) }`, `f(42)`, `()`}, // type parameters {genericPkg + `t0; type t[] int; var _ t`, `t`, `generic_t0.t`}, // t[] is a syntax error that is ignored in this test in favor of t diff --git a/src/cmd/compile/internal/types2/call.go b/src/cmd/compile/internal/types2/call.go index 118e76fdcf..8b45b28017 100644 --- a/src/cmd/compile/internal/types2/call.go +++ b/src/cmd/compile/internal/types2/call.go @@ -173,8 +173,14 @@ func (check *Checker) callExpr(x *operand, call *syntax.CallExpr) exprKind { // evaluate arguments args, _ := check.exprList(call.ArgList, false) + isGeneric := sig.TypeParams().Len() > 0 sig = check.arguments(call, sig, targs, args) + if isGeneric && sig.TypeParams().Len() == 0 { + // update the recorded type of call.Fun to its instantiated type + check.recordTypeAndValue(call.Fun, value, sig, nil) + } + // determine result switch sig.results.Len() { case 0: