]> Cypherpunks repositories - gostls13.git/commit
go/types, types2: use correct reverse inference approach
authorRobert Griesemer <gri@golang.org>
Fri, 9 Jun 2023 00:04:06 +0000 (17:04 -0700)
committerGopher Robot <gobot@golang.org>
Mon, 12 Jun 2023 17:29:51 +0000 (17:29 +0000)
commit3367475e83eeccd79a5c73c2cc2e91e85e482295
tree7c90f07447e9cfe0f4b13ccb054a302dd65823d4
parenteaa4b1a6e4d9f9bec10257a548d25b2425a83ee5
go/types, types2: use correct reverse inference approach

To infer type arguments in an assignment of the form

        var target func(t1, t2, ...) = g

where g is a generic function

        func g[P1, P2, ...](p1, p2, ...)

the type checker used the synthetic function call

        g(t1, t2, ...)

But because each argument (of type) t1, t2, ... is assigned to its
corresponding parameter p1, p2, ..., type inference uses assignment
rules ("inexact match") for unification.

As a result, types such as mystring and string match even though
they should not (they are not identical), yet function parameter
types must be identical to match.

This CL fixes this by constructing the synthetic call

        g'(func(t1, t2, ...))

where g' is the generic function

        func g'[P1, P2, ...](func(p1, p2, ...))

This mimics the function assignment directly by representing it as
a single argument passing (of a function-typed argument). Function
parameter types must now be identical to unify.

As an added benefit, the implementation is simpler.

As a consequence, when such an assignment is invalid because the
function types cannot possibly match, we now correctly get an
inference error. Without this change, in some cases unification
would succeed, only to lead to an assignment error afterwards.

While at it, update the date in the copyright notice of
testdata/manual.go so we don't need to fix it each time we copy
code from a test case in manual.go into a issueXXXXX.go file.

Fixes #60688.

Change-Id: I716247f426ef33d76c7849b0c33c59124e55b859
Reviewed-on: https://go-review.googlesource.com/c/go/+/501938
Reviewed-by: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
src/cmd/compile/internal/types2/call.go
src/cmd/compile/internal/types2/testdata/manual.go
src/go/types/call.go
src/go/types/testdata/manual.go
src/internal/types/testdata/examples/inference2.go
src/internal/types/testdata/fixedbugs/issue60688.go [new file with mode: 0644]