summaryrefslogtreecommitdiff
path: root/src/go/types
Commit message (Collapse)AuthorAgeFilesLines
* cmd/compile: enable more lenient type inference for untyped argumentsRobert Griesemer2023-05-181-0/+1
| | | | | | | | | | | | | | | | | This enables the implementation for proposal #58671, which is a likely accept. By enabling it early we get a bit extra soak time for this feature. The change can be reverted trivially, if need be. For #58671. Change-Id: Id6c27515e45ff79f4f1d2fc1706f3f672ccdd1ab Reviewed-on: https://go-review.googlesource.com/c/go/+/495955 Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: permit partially instantiated functions as function argumentsRobert Griesemer2023-05-163-51/+148
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This CL changes Checker.genericExprList such that it collects partially instantiated generic functions together with their (partial) type argument (and corresponding) expression lists, instead of trying to infer the missing type arguments in place or to report an error. Special care is being taken to explictly record expression types where needed (because we can't use one of the usual expr evaluators which takes care of that), or to track the correct instance expression for later recording with Checker.arguments. The resulting generic expression list is passed to Checker.arguments which is changed to accept explicit partial type argument (and corresponding) expression lists. The provided type arguments are fed into type inference, matching up with their respective type parameters (which were collected already, before this CL). If type inference is successful, the instantiated functions are recorded as needed. For now, the type argument expression lists are collected and passed along but not yet used. We may use them eventually for better error reporting. Fixes #59958. For #59338. Change-Id: I26db47ef3546e64553da49d62b23cd3ef9e2b549 Reviewed-on: https://go-review.googlesource.com/c/go/+/494116 Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: remove superfluous argument test in Checker.argumentsRobert Griesemer2023-05-161-11/+0
| | | | | | | | | | | | | | | | | | | | | | | | There's only two places which call Checker.arguments: Checker.callExpr and Checker.builtin. Both ensure that the passed argument list doesn't contain type expressions, so we don't need that extra check at the start of Checker.arguments. The remaining check causes Checker.arguments to exit early if any of the passed arguments is invalid. This reduces the number of reported errors in rare cases but is executed all the time. If the extra errors are a problem, it would be better to not call Checker.arguments in the first place, or only do the extra check before Checker.arguments reports an error. Removing this code for now. Removes a long-standing TODO. Change-Id: Ief654b680eb6b6a768bb1b4c621d3c8169953f17 Reviewed-on: https://go-review.googlesource.com/c/go/+/495395 Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types: minor refactoring of missingMethod following CL 494615Rob Findley2023-05-121-4/+7
| | | | | | | | | | Make the refactoring suggested by gri@ in that CL. Change-Id: I6c363f3ba5aaa3c616d3982d998b989de7046a86 Reviewed-on: https://go-review.googlesource.com/c/go/+/494617 Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: call recordInstance in instantiateSignatureRobert Griesemer2023-05-121-19/+12
| | | | | | | | | | | | | This matches the pattern we use for type instantiations and factors out the recordInstance and associated assert calls. Change-Id: Ib7731c0e619aca42f418cb2d9a153785aaf014cb Reviewed-on: https://go-review.googlesource.com/c/go/+/494457 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: be sure to type-check wrong methods in missingMethodRob Findley2023-05-121-0/+4
| | | | | | | | | | | | | | | | In the case of a wrong method, we were not ensuring that it was type-checked before passing it to funcString. Formatting the missing method error message requires a fully set-up signature. Fixes #59848 Change-Id: I1467e036afbbbdd00899bfd627a945500dc709c2 Reviewed-on: https://go-review.googlesource.com/c/go/+/494615 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Alan Donovan <adonovan@google.com>
* go/types, types2: move xlist next to targs in Checker.arguments signatureRobert Griesemer2023-05-102-6/+6
| | | | | | | | | | | | | | | | | targs and xlist belong together (xlist contains the type expressions for each of the type arguments). Also, in builtins.go, rename xlist to alist2 to avoid some confusion. Preparation for adding more parameters to the Checker.arguments signature. Change-Id: I960501cfd2b88410ec0d581a6520a4e80fcdc56a Reviewed-on: https://go-review.googlesource.com/c/go/+/494121 Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: control type inference in Checker.funcInst via infer argumentRobert Griesemer2023-05-102-12/+30
| | | | | | | | | | | | | | | | | | | | | If the infer argument is true, funcInst behaves as before. If infer is false and there are not enough type arguments, rather then inferring the missing arguments and instantiating the function, funcInst returns the found type arguments. This permits the use of funcInst (and all the checks it does) to collect the type arguments for partially instantiated generic functions used as arguments to other functions. For #59338. Change-Id: I049034dfde52bd7ff4ae72964ff1708e154e5042 Reviewed-on: https://go-review.googlesource.com/c/go/+/494118 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> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: explicitly look for nil type arguments in inferRobert Griesemer2023-05-101-7/+13
| | | | | | | | | | | | | | | | | | | Don't assume we have all type arguments if the number of type arguments matches the number of type parameters. Instead, look explicitly for nil type arguments in the provided targs. Preparation for type inference with type arguments provided for type parameters of generic function arguments passed to other functions. For #59338. Change-Id: I00918cd5ed06ae3277b4e41a3641063e0f53fef0 Reviewed-on: https://go-review.googlesource.com/c/go/+/494115 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* all: fix a lot of commentscui fliter2023-05-103-3/+3
| | | | | | | | | | | | | Fix comments, including duplicate is, wrong phrases and articles, misspellings, etc. Change-Id: I8bfea53b9b275e649757cc4bee6a8a026ed9c7a4 Reviewed-on: https://go-review.googlesource.com/c/go/+/493035 Reviewed-by: Benny Siegert <bsiegert@gmail.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Run-TryBot: shuang cui <imcusg@gmail.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com>
* go/types, types2: infer minimum default type for untyped argumentsRobert Griesemer2023-05-084-25/+70
| | | | | | | | | | | | | | | This implements the proposal #58671. Must be explicitly enabled and requires proposal approval. For #58671. Change-Id: I150e78f4f3282d6b7cf9d90feeb5f1c5a36d8c38 Reviewed-on: https://go-review.googlesource.com/c/go/+/492835 Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: move functions for untyped constants into const.goRobert Griesemer2023-05-083-293/+309
| | | | | | | | | | | | | No changes to the moved functions. Generate const.go for go/types. Change-Id: I5ac412cecd9f618676a01138aed36428bbce3311 Reviewed-on: https://go-review.googlesource.com/c/go/+/493715 Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: remove genericMultiExpr (inline it in genericExprList)Robert Griesemer2023-05-082-31/+30
| | | | | | | | | | | | Also, remove named return values for exprList, genericExprList. Change-Id: I099abff4572530dd0c3b39c92d6b9a4662d95c2d Reviewed-on: https://go-review.googlesource.com/c/go/+/493557 Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: factor out maximum type computationRobert Griesemer2023-05-052-9/+24
| | | | | | | | | | | | | | For untyped constant binary operations we need to determine the "maximum" (untyped) type which includes both constant types. Factor out this functionality. Change-Id: If42bd793d38423322885a3063a4321bd56443b36 Reviewed-on: https://go-review.googlesource.com/c/go/+/492619 Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: better error message for bad assignmentRobert Griesemer2023-05-051-1/+1
| | | | | | | | | | | | | | | | If the LHS of an assignment is neither addressable nor a map expression (and not the blank identifier), explicitly say so for a better error message. For #3117. Change-Id: I4bffc35574fe390a0567e89182b23585eb5a90de Reviewed-on: https://go-review.googlesource.com/c/go/+/492875 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com>
* go/types, types2: exclude untyped nil arguments early in type inferenceRobert Griesemer2023-05-052-10/+8
| | | | | | | | | | | | | An untyped nil argument cannot be used to infer any type information. We don't need to include it in the untyped arguments. Change-Id: Ied44738ff1b135e65a3acfa19223cd3889b7fa7d Reviewed-on: https://go-review.googlesource.com/c/go/+/492695 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> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: remove Config.EnableReverseTypeInference flagRobert Griesemer2023-05-047-19/+11
| | | | | | | | | | | | | | | | | | | | Proposal #59338 has been accepted and we expect this feature to be available starting with Go 1.21. Remove the flag to explicitly enable it through the API and enable by default. For now keep an internal constant enableReverseTypeInference to guard and mark the respective code, so we can disable it for debugging purposes. For #59338. Change-Id: Ia1bf3032483ae603017a0f459417ec73837e2891 Reviewed-on: https://go-review.googlesource.com/c/go/+/491798 Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: consider generic functions in inference simplify stepRobert Griesemer2023-05-041-0/+20
| | | | | | | | | | | | | | | | | | | | | After type arguments for all type parameters have been determined, the type arguments are "simplified" by substituting any type parameters that might occur in them with their corresponding type arguments until all type parameters have been removed. If in this process a (formerly) generic function signature becomes non-generic, make sure to nil out its (declared) type parameters. Fixes #59953. For #59338. Change-Id: Ie16bffd7b0a8baed18e76e5532cdfaecd26e4278 Reviewed-on: https://go-review.googlesource.com/c/go/+/491797 Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com>
* go/types, types2: rename generic function argumentsRobert Griesemer2023-05-042-2/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For correct inference, if the same generic function is provided more than once as an argument to another function, the argument function's type parameters must be unique for each argument so that the type parameters can be correctly inferred. Example: func f(func(int), func(string)) {} func g[P any](P) {} func _() { f(g, g) } Here the type parameter P for the first g argument resolves to int and the type parameter P for the second g argument resolves to string. Fixes #59956. For #59338. Change-Id: I10ce0ea08c2033722dd7c7c976b2a5448b2ee2d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/492516 Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com>
* go/types, types2: make Checker.renameTParams work on any typeRobert Griesemer2023-05-042-9/+14
| | | | | | | | | | | | | | | | This permits the rewrite of type parameters in arbitrary types, not just tuples. Preparation for fixing #59956. For #59338. Change-Id: I9ccaac1f163051cb837cae2208763cafb1d239cb Reviewed-on: https://go-review.googlesource.com/c/go/+/492515 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com>
* go/types, types2: rename allowVersionf to verifyVersionfRobert Griesemer2023-05-038-21/+21
| | | | | | | | | | | | Follow-up on comment in CL 491715. Change-Id: Ie6a71859e791434b7ab53c5524f35718a3567ecb Reviewed-on: https://go-review.googlesource.com/c/go/+/492236 Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com>
* go/types, types2: use version data type instead of major,minor intsRobert Griesemer2023-05-0311-92/+108
| | | | | | | | | | | | | Also, move version type declaration and associated operations to the top of version.go. Change-Id: I1e6e27c58f97fb2a2ac441dcb97bb7decf8dce71 Reviewed-on: https://go-review.googlesource.com/c/go/+/491795 Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: combine version check with version error reportingRobert Griesemer2023-05-0310-69/+49
| | | | | | | | | | | | | | | | | | This removes the duplicate (and possible error-prone) versions (once for test and once for error message) and simplifies code. Adjusted multiple go/types call sites to match types2. Renamed posFor to atPos in types2, for closer match with go/types and to keep automatic generation of instantiate.go working. Change-Id: Iff428fc742f305a65bb7d077b7e31b66df3b706d Reviewed-on: https://go-review.googlesource.com/c/go/+/491715 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* cmd/compile: enable reverse type inferenceRobert Griesemer2023-05-031-1/+6
| | | | | | | | | | | | For #59338. Change-Id: I8141d421cdc60e47ee5794fc1ca81246bd8a8a25 Reviewed-on: https://go-review.googlesource.com/c/go/+/491475 Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: implement reverse type inference for function argumentsRobert Griesemer2023-05-036-41/+178
| | | | | | | | | | | | | | | | | | | | | | | | | Allow function-typed function arguments to be generic and collect their type parameters together with the callee's type parameters (if any). Use a single inference step to infer the type arguments for all type parameters simultaneously. Requires Go 1.21 and that Config.EnableReverseTypeInference is set. Does not yet support partially instantiated generic function arguments. Not yet enabled in the compiler. Known bug: inference may produce an incorrect result is the same generic function is passed twice in the same function call. For #59338. Change-Id: Ia1faa27a28c6353f0bbfd7f81feafc21bd36652c Reviewed-on: https://go-review.googlesource.com/c/go/+/483935 Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: isParameterized must be able to handle tuplesRobert Griesemer2023-05-012-5/+9
| | | | | | | | | | | | | | | | | CL 484615 rewrote isParameterized by handling tuple types only where they occur (function signatures). However, isParameterized is also called from Checker.callExpr, with a result parameter list which is a tuple. This CL handles tuples again. Fixes #59890. Change-Id: I35159ff65f23322432557e6abcab939933933d40 Reviewed-on: https://go-review.googlesource.com/c/go/+/490695 Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: remove parse (we only need mustParse for tests)Robert Griesemer2023-04-281-19/+5
| | | | | | | | | | | | | While at it, also simplify mustTypecheck again as it can just use typecheck. Change-Id: I6cb07b1078d9a39e0f22851028fdd4442127f2f1 Reviewed-on: https://go-review.googlesource.com/c/go/+/490015 Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: extract package name from test sources automaticallyRobert Griesemer2023-04-2813-113/+113
| | | | | | | | | | | | | | | This simplifies explicit tests and ensures that the error messages contain the package name instead of a generic file name like "p.go". Fixes #59736. Change-Id: I1b42e30f53ba88456e92f990d80ca68ffc987e20 Reviewed-on: https://go-review.googlesource.com/c/go/+/486617 TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: call mustParse when using mustTypecheckRobert Griesemer2023-04-281-1/+8
| | | | | | | | | | | | | | | | Syntactically incorrect source files may produce valid (but unexpected) syntax trees, leading to difficult to understand test failures. Make sure to call mustParse when we call mustTypecheck. Change-Id: I9f5ba3fe57ad3bbc16caabf285d2e7aeb5b9de0c Reviewed-on: https://go-review.googlesource.com/c/go/+/489995 Run-TryBot: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com>
* go/types, types2: abort type unification if no progress is madeRobert Griesemer2023-04-211-1/+1
| | | | | | | | | | | | | Fixes #59740. For #59750. Change-Id: I153d0a412bdfb15f81d6999e29691dc093fd0fcb Reviewed-on: https://go-review.googlesource.com/c/go/+/487197 Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com>
* go/types: fix version downgrade bug without Config.GoVersionRuss Cox2023-04-202-2/+5
| | | | | | | | | | | | | | The gVisor team reported a regression in their checkers, which don't set Config.GoVersion, processing files that say //go:build go1.13 but still use 'any' (which happened in Go 1.18). That situation should continue to work, since it worked before, so add a special case for not knowing the GoVersion. Change-Id: I8820d8ccbdf76d304e2c7e45f6aaa993ff3d16a6 Reviewed-on: https://go-review.googlesource.com/c/go/+/486398 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com>
* go/types, types2: be deliberate with Checker.use in Checker.assignVarRobert Griesemer2023-04-191-1/+2
| | | | | | | | | | | | Follow-up on comment in CL 486135. Cleanup. Change-Id: Ib0480d52e30687350f8328965c18fa83262df0a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/486215 Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: don't panic for invalid assignments of comma-ok expressionsRobert Griesemer2023-04-191-6/+16
| | | | | | | | | | | | | | | | | | | | | | | | The relevant code was broken with CL 478218. Before that CL, Checker.assignVar used to return the assigned type, or nil, in case of failure. Checker.recordCommaOkTypes used to take two types (not two operands), and if one of those types was nil, it would simply not record. CL 478218, lost that (nil) signal. This change consistently reports an assignment check failure by setting x.mode to invalid for initVar and assignVar and then tests if x.mode != invalid before recording a comma-ok expression. Fixes #59371. Change-Id: I193815ff3e4b43e3e510fe25bd0e72e0a6a816c6 Reviewed-on: https://go-review.googlesource.com/c/go/+/486135 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: consistently set x.mode in Checker.assignmentRobert Griesemer2023-04-181-0/+3
| | | | | | | | | | | | | | | | Per the doc string, Checker.assignment must set x.mode to invalid in case of failure. (It may be simpler to return a bool, but the operand x may be tested by callers several stack frames above.) Change-Id: Ia1789b0396e8338103c0e707761c46f8d253fd31 Reviewed-on: https://go-review.googlesource.com/c/go/+/485875 Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com>
* go/types, types2: factor out type parameter renaming from type inferenceRobert Griesemer2023-04-172-10/+16
| | | | | | | | | | | | | | | | | Preparation for reverse type inference where there is no need to rename all type parameters supplied to type inference when passing generic functions as arguments to (possibly generic) function calls. This also leads to a better separation of concerns. Change-Id: Id487a5c1340b743519b9053edc43f8aa99408522 Reviewed-on: https://go-review.googlesource.com/c/go/+/484655 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: (slightly) refactor tpWalker.isParameterized (cleanup)Robert Griesemer2023-04-171-29/+25
| | | | | | | | | | | | Match the structure of cycleFinder. Removes a TODO. Change-Id: Iec0abfc809cd522f64db8900a1f8a70cbba504ee Reviewed-on: https://go-review.googlesource.com/c/go/+/484615 Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com>
* go/types,types2: fix panic in reverse type inference when -lang<go1.18Rob Findley2023-04-141-1/+7
| | | | | | | | | | | | | | Due to reverse type inference, we may not have an index expression when type-checking a function instantiation. Fix a panic when the index expr is nil. Fixes #59639 Change-Id: Ib5de5e49cdb7b339653e4fb775bf5c5fdb3c6907 Reviewed-on: https://go-review.googlesource.com/c/go/+/484757 Reviewed-by: Russ Cox <rsc@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Findley <rfindley@google.com>
* go/types, cmd/compile/internal/types2: use per-file Go versionRuss Cox2023-04-1415-47/+124
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For #57001, compilers and others tools will need to understand that a different Go version can be used in different files in a program, according to the //go:build lines in those files. Update go/types and cmd/compile/internal/types2 to track and use per-file Go versions. The two must be updated together because of the files in go/types that are generated from files in types2. The effect of the //go:build go1.N line depends on the Go version declared in the 'go 1.M' line in go.mod. If N > M, the file gets go1.N semantics when built with a Go 1.N or later toolchain (when built with an earlier toolchain the //go:build line will keep the file from being built at all). If N < M, then in general we want the file to get go1.N semantics as well, meaning later features are disabled. However, older Go 1.M did not apply this kind of downgrade, so for compatibility, N < M only has an effect when M >= 21, meaning when using semantics from Go 1.21 or later. For #59033. Change-Id: I93cf07e6c687d37bd37a9461dc60cc032bafd01d Reviewed-on: https://go-review.googlesource.com/c/go/+/476278 TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Russ Cox <rsc@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Russ Cox <rsc@golang.org>
* go/types,types2: add a test for const initializer panicRob Findley2023-04-131-0/+28
| | | | | | | | | | Updates #59603 Change-Id: Iff99f45a72a259b57b2ebbc6c0f9ed710add3ae3 Reviewed-on: https://go-review.googlesource.com/c/go/+/484376 Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com>
* Revert "go/types, types2: remove unnecessary tests for x.typ == Typ[Invalid]"Robert Findley2023-04-131-2/+6
| | | | | | | | | | | | | | | | This reverts commit 4c49d52439805c248f4a01d529b90b22e821b7d6. Reason for revert: it is trickier than expected to enforce an invariant that x.typ == Typ[Invalid] => x.mode == invalid. For example, builtins have invalid type until their call is evaluated. I think it is better to keep this defensive code for now. My bad for suggesting this strictness. I will send a follow-up CL with a test that exercises the panic discovered inside Google, and a bit more commentary about what 'invalid' means in both contexts. Fixes #59603 Change-Id: If291f7268e7ef7ae6cd9bb861bb9af349a729cb2 Reviewed-on: https://go-review.googlesource.com/c/go/+/484375 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Findley <rfindley@google.com>
* go/types, types2: factor out inference cycle detector (cleanup)Robert Griesemer2023-04-131-8/+19
| | | | | | | | | | Change-Id: If3c6724497dfbe8611ffffb4735e47ddc53a742c Reviewed-on: https://go-review.googlesource.com/c/go/+/484158 Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: generalize tparamIndex to arbitrary type parameter listsRobert Griesemer2023-04-131-10/+6
| | | | | | | | | | | | | | | | | | | | | | | | | tparamIndex returns the index of a type parameter given the type parameter and a list of type parameters. If an index >= 0 is returned, it is the index assigned to the type parameter (TypeParam.index), and the index of the type parameter in the provided list of parameters. For it to work correctly, the type parameter list must be from a single type parameter declaration. To allow for lists of arbitrary type parameters (from different generic signatures), change the implementation to do a linear search. The result is the index of the type parameter in the provided type parameter list, which may be different from the index assigned to the type parameter. The linear search is likely fast enough since type parameter lists tend to be very short. Change-Id: I913f97fa4c042abeb535ee86ca6657241a4cf796 Reviewed-on: https://go-review.googlesource.com/c/go/+/483995 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* all: add wasip1 supportJohan Brandhorst-Satzkorn2023-04-111-1/+1
| | | | | | | | | | | | | | | | | Fixes #58141 Co-authored-by: Richard Musiol <neelance@gmail.com> Co-authored-by: Achille Roussel <achille.roussel@gmail.com> Co-authored-by: Julien Fabre <ju.pryz@gmail.com> Co-authored-by: Evan Phoenix <evan@phx.io> Change-Id: I49b66946acc90fdf09ed9223096bfec9a1e5b923 Reviewed-on: https://go-review.googlesource.com/c/go/+/479627 Run-TryBot: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Auto-Submit: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com> Auto-Submit: Ian Lance Taylor <iant@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com> TryBot-Bypass: Ian Lance Taylor <iant@golang.org>
* go/types, types2: adjust Check.funcInst signatureRobert Griesemer2023-03-292-18/+14
| | | | | | | | | | | | Per feedback from prior CL. Change-Id: Icbf6149c3b61e26085caf6f368d22ad4f02c75fd Reviewed-on: https://go-review.googlesource.com/c/go/+/480316 Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: slightly tighter checks in Checker.useRobert Griesemer2023-03-291-1/+1
| | | | | | | | | | | | | | Checker.use is called to check expressions and "use" variables in case of an error. Use Checker.exprOrType instead of just rawExpr. Change-Id: I4da6fa51ef3b0c9b07c453494452836caced9b1a Reviewed-on: https://go-review.googlesource.com/c/go/+/479897 Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: reverse inference of function type argumentsRobert Griesemer2023-03-2911-81/+194
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This CL implements type inference for generic functions used in assignments: variable init expressions, regular assignments, and return statements, but (not yet) function arguments passed to functions. For instance, given a generic function func f[P any](x P) and a variable of function type var v func(x int) the assignment v = f is valid w/o explicit instantiation of f, and the missing type argument for f is inferred from the type of v. More generally, the function f may have multiple type arguments, and it may be partially instantiated. This new form of inference is not enabled by default (it needs to go through the proposal process first). It can be enabled by setting Config.EnableReverseTypeInference. The mechanism is implemented as follows: - The various expression evaluation functions take an additional (first) argument T, which is the target type for the expression. If not nil, it is the type of the LHS in an assignment. - The method Checker.funcInst is changed such that it uses both, provided type arguments (if any), and a target type (if any) to augment type inference. Change-Id: Idfde61078e1ee4f22abcca894a4c84d681734ff6 Reviewed-on: https://go-review.googlesource.com/c/go/+/476075 TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types, types2: don't report assignment mismatch errors if there are other ↵Robert Griesemer2023-03-282-21/+29
| | | | | | | | | | | | | | | | | | errors Change the Checker.use/useLHS functions to report if all "used" expressions evaluated without error. Use that information to control whether to report an assignment mismatch error or not. This will reduce the number of errors reported per assignment, where the assignment mismatch is only one of the errors. Change-Id: Ia0fc3203253b002e4e1d5759d8d5644999af6884 Reviewed-on: https://go-review.googlesource.com/c/go/+/478756 Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com>
* go/types, types2: simplify Checker.exprListRobert Griesemer2023-03-283-5/+5
| | | | | | | | | | Change-Id: I7e9e5bef9364afc959c66d9765180c4ed967f517 Reviewed-on: https://go-review.googlesource.com/c/go/+/478755 Run-TryBot: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: remove return values from Checker.assignVar/initVarRobert Griesemer2023-03-281-19/+10
| | | | | | | | | | | | Not needed anymore. Change-Id: I5229d556ba1625f53b9fa23b496c17138a92fc3e Reviewed-on: https://go-review.googlesource.com/c/go/+/478717 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com>
* go/types, types2: refactor initVarsRobert Griesemer2023-03-281-45/+88
| | | | | | | | | | | | | | | | As with changes in prior CLs, we don't suppress legitimate "declared but not used" errors anymore simply because the respective variables are used in incorrect assignments, unrelated to the variables in question. Adjust several (ancient) tests accordingly. Change-Id: I5826393264d9d8085c64777a330d4efeb735dd2d Reviewed-on: https://go-review.googlesource.com/c/go/+/478716 Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com>