summaryrefslogtreecommitdiff
path: root/src/go/types/call.go
Commit message (Collapse)AuthorAgeFilesLines
* go/types, types2: permit partially instantiated functions as function argumentsRobert Griesemer2023-05-161-44/+118
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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, 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: move xlist next to targs in Checker.arguments signatureRobert Griesemer2023-05-101-2/+2
| | | | | | | | | | | | | | | | | 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-101-10/+28
| | | | | | | | | | | | | | | | | | | | | 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: remove genericMultiExpr (inline it in genericExprList)Robert Griesemer2023-05-081-10/+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: remove Config.EnableReverseTypeInference flagRobert Griesemer2023-05-041-1/+1
| | | | | | | | | | | | | | | | | | | | 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: rename generic function argumentsRobert Griesemer2023-05-041-2/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-041-3/+5
| | | | | | | | | | | | | | | | 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-031-3/+3
| | | | | | | | | | | | 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-031-9/+9
| | | | | | | | | | | | | 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-031-19/+11
| | | | | | | | | | | | | | | | | | 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>
* go/types, types2: implement reverse type inference for function argumentsRobert Griesemer2023-05-031-24/+101
| | | | | | | | | | | | | | | | | | | | | | | | | 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-011-2/+2
| | | | | | | | | | | | | | | | | 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: factor out type parameter renaming from type inferenceRobert Griesemer2023-04-171-3/+11
| | | | | | | | | | | | | | | | | 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: 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-141-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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: adjust Check.funcInst signatureRobert Griesemer2023-03-291-15/+7
| | | | | | | | | | | | 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-291-20/+99
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-281-8/+13
| | | | | | | | | | | | | | | | | | 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-281-3/+3
| | | | | | | | | | 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: more systematic use of Checker.use und useLHSRobert Griesemer2023-03-281-14/+46
| | | | | | | | | | | | | | | | | | | | This CL re-introduces useLHS because we don't want to suppress correct "declared but not used" errors for variables that only appear on the LHS of an assignment (using Checker.use would mark them as used). This CL also adjusts a couple of places where types2 differed from go/types (and suppressed valid "declared and not used" errors). Now those errors are surfaced. Adjusted a handful of tests accordingly. Change-Id: Ia555139a05049887aeeec9e5221b1f41432c1a57 Reviewed-on: https://go-review.googlesource.com/c/go/+/478635 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: remove Checker.useLHS - not neededRobert Griesemer2023-03-211-35/+8
| | | | | | | | | | | | | | | | We can just use Checker.use, as long as we take care of blank (_) identifiers that may appear of the LHS of assignments. It's ok to "use" non-blank variables in case of an error, even on the LHS. This makes this code match the types2 implementation. Change-Id: Ied9b9802ecb63912631bbde1dc6993ae855a691b Reviewed-on: https://go-review.googlesource.com/c/go/+/477895 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: refactor multiExpr and exprListRobert Griesemer2023-03-211-26/+1
| | | | | | | | | | | | Preparation for simpler exprList use. Change-Id: I2d62bbaba006aa3a378ec743564d46c5edcb8b47 Reviewed-on: https://go-review.googlesource.com/c/go/+/478016 Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@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: use go.dev/issue/nnnnn when referring to an issue (cleanup)Robert Griesemer2023-01-201-4/+4
| | | | | | | | | | | | | | | | | Apply the following regex substitutions, in order: golang/go#(\d+) => go.dev/issue/$1 issue #?(\d+) => go.dev/issue/$1 Providing a link uniformly makes it easier to find the respective issue. Change-Id: I9b60ffa1adb95be181f6711c2f171be3afe2b315 Reviewed-on: https://go-review.googlesource.com/c/go/+/462856 TryBot-Result: Gopher Robot <gobot@golang.org> 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>
* go/types: consistently use _ prefix for unexported names that are exported ↵Robert Griesemer2023-01-171-1/+1
| | | | | | | | | | | | in types2 Change-Id: Ic9b24b4b3a6336782023c7db40cc937f2dc743df Reviewed-on: https://go-review.googlesource.com/c/go/+/461606 TryBot-Result: Gopher Robot <gobot@golang.org> 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>
* go/types: use nopos instead of token.NoPos to match types2Robert Griesemer2023-01-171-3/+3
| | | | | | | | | | | | This will simplify the generation of go/types files from types2 files. Change-Id: Ie9c8061346cff098cb884908c7eb569267886594 Reviewed-on: https://go-review.googlesource.com/c/go/+/461082 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
* go/types: make tracing configurable (matching types2)Robert Griesemer2023-01-171-1/+1
| | | | | | | | | | | | | | | | | | | This CL replaces the internal trace flag with Config.trace. While unexported, it can still be set for testing via reflection. The typical use is for manual tests, where -v (verbose) turns on tracing output. Typical use: go test -run Manual -v This change makes go/types match types2 behavior. Change-Id: I22842f4bba8fd632efe5929c950f4b1cab0a8569 Reviewed-on: https://go-review.googlesource.com/c/go/+/461081 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: don't look up fields or methods when expecting a typeRobert Findley2023-01-111-1/+20
| | | | | | | | | | | | | | | | | As we have seen many times, the type checker must be careful to avoid accessing named type information before the type is fully set up. We need a more systematic solution to this problem, but for now avoid one case that causes a crash: checking a selector expression on an incomplete type when a type expression is expected. For golang/go#57522 Change-Id: I7ed31b859cca263276e3a0647d1f1b49670023a9 Reviewed-on: https://go-review.googlesource.com/c/go/+/461577 Run-TryBot: Robert Findley <rfindley@google.com> Auto-Submit: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com>
* go/types, types2: better error message for invalid method expressionRobert Griesemer2022-12-061-1/+5
| | | | | | | | | | | | Fixes #53358. Change-Id: I38528da1596b6e1aaedcab89b1513fb8acac596c Reviewed-on: https://go-review.googlesource.com/c/go/+/455335 Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@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: ensure signatures are instantiated if all type argsRobert Findley2022-11-181-7/+28
| | | | | | | | | | | | | | | | | | are provided Improve the accuracy of recorded types and instances for function calls, by instantiating their signature before checking arguments if all type arguments are provided. This avoids a problem where fully instantiated function signatures are are not recorded as such following an error checking their arguments. Fixes golang/go#51803 Change-Id: Iec4cbd219a2cd19bb1bcf2a5c4019f556e4304b1 Reviewed-on: https://go-review.googlesource.com/c/go/+/451436 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types: replace invalid(AST|Arg|Op) with errorf and message prefixRobert Griesemer2022-10-111-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | This brings go/types error reporting closer to types2. Except for removing the error functions and one manual correction, these changes were made by regex-replacing: check\.invalidAST\((.*), " => check.errorf($1, InvalidSyntaxTree, invalidAST+" check\.invalidOp\((.*), " => check.errorf($1, invalidOp+" check\.invalidArg\((.*), " => check.errorf($1, invalidArg+" A follow-up CL ensures that we use error instead of errorf where possible. Change-Id: Iac53dcd9c122b058f98d26d0fb307ef1dfe4e79b Reviewed-on: https://go-review.googlesource.com/c/go/+/441955 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: use zero error code to indicate unset error codeRobert Griesemer2022-10-101-1/+1
| | | | | | | | | | | | | | Use InvalidSyntaxError where the zero error code was used before. Fix a couple of places that didn't set an error code. Panic in error reporting if no error code is provided. Change-Id: I3a537d42b720deb5c351bf38871e04919325e231 Reviewed-on: https://go-review.googlesource.com/c/go/+/439566 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com>
* go/types: use internal/types/errors instead of local error codesRobert Griesemer2022-10-101-23/+24
| | | | | | | | | | | | This change adds a new dependency to go/types. Change-Id: I7e40b95c8c1e1356b638fc1aa2ef16ce91e9a496 Reviewed-on: https://go-review.googlesource.com/c/go/+/439563 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>
* go/types, types2: report "undefined: p.x" instead of "x not declared by ↵Robert Griesemer2022-09-261-2/+2
| | | | | | | | | | | | | | | package p" This matches the compiler's long-standing behavior. For #55326. Change-Id: Icd946b031b1b6e65498fb52bceb4a53807732463 Reviewed-on: https://go-review.googlesource.com/c/go/+/432556 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
* go/types, types2: ensure that named types never expand infinitelyRobert Findley2022-06-061-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | During type-checking, newly created instances share a type checking Context which de-duplicates identical instances. However, when unexpanded types escape the type-checking pass or are created via calls to Instantiate, they lack this shared context. As reported in #52728, this may lead to infinitely many identical but distinct types that are reachable via the API. This CL introduces a new invariant that ensures we don't create such infinitely expanding chains: instances created during expansion share a context with the type that led to their creation. During expansion, the expanding type passes its Context to any newly created instances. This ensures that cycles will eventually terminate with a previously seen instance. For example, if we have an instantiation chain T1[P]->T2[P]->T3[P]->T1[P], by virtue of this Context passing the expansion of T3[P] will find the instantiation T1[P]. In general, storing a Context in a Named type could lead to pinning types in memory unnecessarily, but in this case the Context pins only those types that are reachable from the original instance. This seems like a reasonable compromise between lazy and eager expansion. Our treatment of Context was a little haphazard: Checker.bestContext made it easy to get a context at any point, but made it harder to reason about which context is being used. To fix this, replace bestContext with Checker.context, which returns the type-checking context and panics on a nil receiver. Update all call-sites to verify that the Checker is non-nil when context is called. Also make it a panic to call subst with a nil context. Instead, update subst to explicitly accept a local (=instance) context along with a global context, and require that one of them is non-nil. Thread this through to the call to Checker.instance, and handle context updating there. Fixes #52728 Change-Id: Ib7f26eb8c406290325bc3212fda25421a37a1e8e Reviewed-on: https://go-review.googlesource.com/c/go/+/404885 Reviewed-by: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Findley <rfindley@google.com>
* go/types: use error_.errorf for reporting related error informationRobert Findley2022-04-221-5/+4
| | | | | | | | | | | | | | Use error_.errorf for reporting related error information rather than inlining the "\n\t". This aligns go/types with types2 in cases where the related information has no position information. In other cases, go/types needs to report a "continuation error" (starting with '\t') so that users can access multiple error positions. Change-Id: Ica98466596c374e0c1e502e7227c8d8c803b4c22 Reviewed-on: https://go-review.googlesource.com/c/go/+/400825 Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com>
* go/types, types2: improved tracing output throughout (debugging support)Robert Griesemer2022-03-211-2/+2
| | | | | | | | | | This change fine-tunes tracing output and adds additional descriptions for delayed actions that were missing tracing. Change-Id: Ib5e70e8f40ef564194cdb0e8d12c38e15388b987 Reviewed-on: https://go-review.googlesource.com/c/go/+/387919 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: don't crash in selectors referring to the type being declaredRobert Griesemer2022-03-071-1/+7
| | | | | | | | | | | | | | | In Checker.typInternal, the SelectorExpr case was the only case that didn't either set or pass along the incoming def *Named type. Handle this by passing it along to Checker.selector and report a cycle if one is detected. Fixes #51509. Change-Id: I6c2d46835f225aeb4cb25fe0ae55f6180cef038b Reviewed-on: https://go-review.googlesource.com/c/go/+/390314 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: report an error for x.sel where x is a built-inRobert Griesemer2022-02-261-1/+6
| | | | | | | | | | | | | | | | | | | | | In case of a selector expression x.sel where x is a built-in we didn't report an error because the type of built-ins is invalid and we surpress errors on operands of invalid types, assuming that an error has been reported before. Add a corresponding check for this case. Review all places where we call Checker.exprOrType to ensure (invalid) built-ins are reported. Adjusted position for index error in types2. Fixes #51360. Change-Id: I24693819c729994ab79d31de8fa7bd370b3e8469 Reviewed-on: https://go-review.googlesource.com/c/go/+/388054 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: rename structuralType/String to coreType/StringRobert Griesemer2022-02-091-1/+1
| | | | | | | | | | | | | | | | This is a pure rename of the respective Go functions/methods with corresponding adjustments to error messages and tests. A couple of comments were manually rephrased. With this change, the implementation and error messages match the latest spec. No functionality change. Change-Id: Iaa92a08b64756356fb2c5abdaca5c943c9105c96 Reviewed-on: https://go-review.googlesource.com/c/go/+/384618 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: avoid field/method lookup error on invalid typesRobert Griesemer2022-01-181-0/+5
| | | | | | | | | Fixes #49541. Change-Id: I27a52d0722a7408758682e7ddcd608c0a6c4881b Reviewed-on: https://go-review.googlesource.com/c/go/+/378175 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: refer to type parameter if so for interface pointer errorsRobert Griesemer2022-01-101-1/+1
| | | | | | | | | | | | | | | Follow-up on comment in CL 376914. Also: - add missing check != nil test in assignableTo - use check.sprintf rather than fmt.Sprintf in missingMethodReason For #48312. Change-Id: Ie209b4101a7f2c279e42a59987d0068079c8b69f Reviewed-on: https://go-review.googlesource.com/c/go/+/377375 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: better error message for type parameter field accessRobert Griesemer2022-01-101-29/+16
| | | | | | | | | | | | Fixes #50516. Also call DefPredeclaredTestFuncs in TestFixedbugs so it can be run independently again. Change-Id: I78d4cc11790b1543a2545a7ab297a223b3d5e3c8 Reviewed-on: https://go-review.googlesource.com/c/go/+/376954 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: better error message when using *interface instead of ↵Robert Griesemer2022-01-101-26/+38
| | | | | | | | | | | | | | | | | | | interface - detect *interface case and report specific error - replaced switch with sequence of if's for more clarity - fixed isInterfacePtr: it applies to all interfaces, incl. type parameters - reviewed/fixed all uses of isInterfacePtr - adjusted error messages to be consistently of the format "type %s is pointer to interface, not interface" Fixes #48312. Change-Id: Ic3c8cfcf93ad57ecdb60f6a727cce9e1aa4afb5d Reviewed-on: https://go-review.googlesource.com/c/go/+/376914 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types, types2: ensure that signature type bounds are interfacesRobert Griesemer2022-01-061-11/+15
| | | | | | | | | | | | | | | Do this by running verification for instantiated signatures later, after the delayed type parameter set-up had a chance to wrap type bounds in implicit interfaces where needed. Fixes #50450 Change-Id: If3ff7dc0be6af14af854830bfddb81112ac575cb Reviewed-on: https://go-review.googlesource.com/c/go/+/375737 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
* go/types: better error position for instantiation failureRobert Griesemer2021-11-291-23/+16
| | | | | | | | | | | | | | | This is a port of CL 366757 from types2 to go/types, adjusted for the different handling of index expressions in go/types. For #49179. Change-Id: Ic859eb09683134d055e28c8e0cb1f3814a87dc5c Reviewed-on: https://go-review.googlesource.com/c/go/+/367198 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>
* go/types: report types for mismatched call and return statementsRobert Griesemer2021-11-291-6/+19
| | | | | | | | | | | | | | | | | | | | | | | This is a port of CL 364874 from types2 to go/types with various adjustments: - the error position for "not enough arguments" in calls is the closing ) rather than the position of the last provided argument - the ERROR comments in tests are positioned accordingly - the reg. expression for matching error strings accepts newlines for the . pattern (added s flag) For #48834. For #48835. Change-Id: I64362ecf605bcf9d89b8dc121432e0131bd5da1b Reviewed-on: https://go-review.googlesource.com/c/go/+/367196 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>
* go/types: underlying type of a type parameter is its constraint interfaceRobert Findley2021-11-171-1/+1
| | | | | | | | | | | | | | | This is a port of CL 359016 from types2 to go/types. Some of the code around untyped nil differed (because we have to treat untyped nil differently in go/types for historical reasons). Updates #47916 Change-Id: Ifc428ed977bf2f4f84cc831f1a3527156940d7b8 Reviewed-on: https://go-review.googlesource.com/c/go/+/364716 Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>