]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: update the recorded function type after inference
authorRobert Griesemer <gri@golang.org>
Tue, 5 Oct 2021 00:44:56 +0000 (17:44 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 5 Oct 2021 17:10:45 +0000 (17:10 +0000)
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 <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/types2/api_test.go
src/cmd/compile/internal/types2/call.go

index ca81620a78ef938d8b0268554f3b34673d455e29..4966848ed41ca509bc1a0813ef6a65182a3551f1 100644 (file)
@@ -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
index 118e76fdcf41663a455a7868c3e4af3d5dd57e82..8b45b28017d6f03681972b4d98d7ae4b5ea5c070 100644 (file)
@@ -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: