aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/types2/predicates.go
AgeCommit message (Collapse)Author
2024-05-23go/types, types2: instantiate generic alias typesRobert Griesemer
For #46477. Change-Id: Ifa47d3ff87f67c60fa25654e54194ca8b31ea5a2 Reviewed-on: https://go-review.googlesource.com/c/go/+/567617 Auto-Submit: Robert Griesemer <gri@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com>
2024-04-25go/types, types2: simplify Default functionRobert Griesemer
Change-Id: Ie2b7c1324ec7947c6ff43187dda99b83bcb64f08 Reviewed-on: https://go-review.googlesource.com/c/go/+/581775 Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
2024-04-25go.types, types2: factor out isUntypedNumeric predicateRobert Griesemer
No need for Unalias or under calls for this predicate. Change-Id: Idcdcda3e153d829ee5b26ad112ccfda3f4efedde Reviewed-on: https://go-review.googlesource.com/c/go/+/581255 Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Robert Griesemer <gri@google.com>
2024-02-22go/types, types2: remove unreachable func (minor cleanup)Robert Griesemer
In some places we can't use unreachable() because it does not terminate control flow and we need to resort to panic. Be consistent and just use panic("unreachable") everywhere. This also opens the door to reporting more specific panic messages. Mechanical change: s/unreachable()/panic("unreachable")/ Minor cleanup for better consistency. Change-Id: I6b52af7c21dcfaa1ca19839d14040552db5d4cb4 Reviewed-on: https://go-review.googlesource.com/c/go/+/566135 Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com>
2024-01-26go/types, types2: use existing case-insensitive lookup (remove TODO)Robert Griesemer
Rather than implementing a new, less complete mechanism to check if a selector exists with different capitalization, use the existing mechanism in lookupFieldOrMethodImpl by making it available for internal use. Pass foldCase parameter all the way trough to Object.sameId and thus make it consistently available where Object.sameId is used. From sameId, factor out samePkg functionality into stand-alone predicate. Do better case distinction when reporting an error for an undefined selector expression. Cleanup. Change-Id: I7be3cecb4976a4dce3264c7e0c49a320c87101e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/558315 Reviewed-by: Robert Griesemer <gri@google.com> 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>
2023-11-13go/types, types2: implement Alias proposal (export API)Robert Griesemer
This CL exports the previously unexported Alias type and corresponding functions and methods per issue #63223. Whether Alias types are used or not is controlled by the gotypesalias setting with the GODEBUG environment variable. Setting gotypesalias to "1" enables the Alias types: GODEBUG=gotypesalias=1 By default, gotypesalias is not set. Adjust test cases that enable/disable the use of Alias types to use -gotypesalias=1 or -gotypesalias=0 rather than -alias and -alias=false for consistency and to avoid confusion. For #63223. Change-Id: I51308cad3320981afac97dd8c6f6a416fdb0be55 Reviewed-on: https://go-review.googlesource.com/c/go/+/541737 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> Reviewed-by: Robert Griesemer <gri@google.com>
2023-11-09go/types, types2: introduce _Alias type nodeRobert Griesemer
This change introduces a new (unexported for now) _Alias type node which serves as an explicit representation for alias types in type alias declarations: type A = T The _Alias node stands for the type A in this declaration, with the _Alias' actual type pointing to (the type node for) T. Without the _Alias node, (the object for) A points directly to T. Explicit _Alias nodes permit better error messages (they mention A instead of T if the type in the source was named A) and can help with certain type cycle problems. They are also needed to hold type parameters for alias types, eventually. Because an _Alias node is simply an alternative representation for an aliased type, code that makes type-specific choices must always look at the actual (unaliased) type denoted by a type alias. The new function func _Unalias(t Type) Type performs the necessary indirection. Type switches that consider type nodes, must either switch on _Unalias(typ) or handle the _Alias case. To avoid breaking clients, _Alias nodes must be enabled explicitly, through the new Config flag _EnableAlias. To run tests with the _EnableAlias set, use the new -alias flag as in "go test -run short -alias". The testing harness understands the flag as well and it may be used to enable/disable _Alias nodes on a per-file basis, with a comment ("// -alias" or // -alias=false) on the first line in those files. The file-based flag overrides the command-line flag. The use of _Alias nodes is disabled by default and must be enabled by setting _EnableAlias. Passes type checker tests with and without -alias flag set. For #25838. For #44410. For #46477. Change-Id: I78e178a1aef4d7f325088c0c6cbae4cfb1e5fb5c Reviewed-on: https://go-review.googlesource.com/c/go/+/521956 Reviewed-by: Matthew Dempsky <mdempsky@google.com> 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>
2023-10-03go/types, types2: don't implicitly modify an argument function's typeRobert Griesemer
See the comment in the (very small) fix for a detailed description. Use the opportunity to introduce a generic clone function which may be useful elsewhere. Fixes #63260. Change-Id: Ic63c6b8bc443011b1a201908254f7d062e1aec71 Reviewed-on: https://go-review.googlesource.com/c/go/+/532157 Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
2023-09-15go/types, types2: introduce `isValid` predicate and use throughoutRobert Griesemer
Preparation for Alias type nodes. Using a predicate will ensure that alias indirection can be taken care of when needed, eventually. Change-Id: I689fab6052060eb6bcb2eeac28ba09fdb73f6868 Reviewed-on: https://go-review.googlesource.com/c/go/+/528695 Reviewed-by: Heschi Kreinick <heschi@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>
2023-08-30go/types, types2: use asNamed(t) instead of t.(*Named) type assertionsRobert Griesemer
Preparation for the introduction of alias types. Because asNamed is not exported, existing external tests continue to use t.(*Named). Change-Id: I4754b406dd6b23030d3703a486d6f6620b2464fe Reviewed-on: https://go-review.googlesource.com/c/go/+/522876 Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
2023-07-18all: fix typosJes Cok
Change-Id: I510b0a4bf3472d937393800dd57472c30beef329 GitHub-Last-Rev: 8d289b73a37bd86080936423d981d21e152aaa33 GitHub-Pull-Request: golang/go#60960 Reviewed-on: https://go-review.googlesource.com/c/go/+/505398 Auto-Submit: Robert Findley <rfindley@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com>
2023-05-05go/types, types2: factor out maximum type computationRobert Griesemer
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>
2023-03-09go/types, types2: clean up defined type identity check/unificationRobert Griesemer
Factor out check for identical origin. Match unification code with type identity check. Add a test case for #53692. Change-Id: I1238b28297a5ac549e99261c8a085dd46f3dd65f Reviewed-on: https://go-review.googlesource.com/c/go/+/474197 Run-TryBot: 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> Auto-Submit: Robert Griesemer <gri@google.com>
2023-02-25go/types, types2: add isTypeLit predicateRobert Griesemer
Preparation for next CL. Change-Id: I5ef170a04577d8aea10255e304357bdbea4935a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/470919 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>
2023-02-02go/types, types2: enable new type inferenceRobert Griesemer
Enable new type inference and compare result with old inference implementation - the result must be identical in a correct program. Change-Id: Ic802d29fcee744f6f826d5e433a3d0c0e73b68e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/464341 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> Reviewed-by: Robert Griesemer <gri@google.com>
2023-02-02go/types, types2: use a comparer struct to control the identical predicateRobert Griesemer
This makes it easier to configure the behavior of identical: we can simply add fields to the comparer instead of adding more parameters to identical. Change-Id: I9a6f5451b3ee5c37e71486060653c5a6e8f24304 Reviewed-on: https://go-review.googlesource.com/c/go/+/464937 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>
2022-11-21go/types, types2: report empty type sets in operand descriptionsRobert Griesemer
This leads to better error messages where operations are not permitted because of empty type sets. Fixes #51525. Change-Id: I8d15645e2aff5145e458bdf9aaa4d2bee28d37fa Reviewed-on: https://go-review.googlesource.com/c/go/+/452535 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> Reviewed-by: Robert Griesemer <gri@google.com>
2022-06-24go/types, types2: better errors for == when type sets are emptyRobert Griesemer
For #51525. Change-Id: I3762bc4a48a1aaab3b006b1ad1400f866892243c Reviewed-on: https://go-review.googlesource.com/c/go/+/413934 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Robert Findley <rfindley@google.com>
2022-06-06go/types, types2: ensure that named types never expand infinitelyRobert Findley
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>
2022-06-06go/types, types2: store Named instance information separatelyRobert Findley
Separate instance information into an instance struct, to reduce memory footprint for non-instance Named types. This may induce a sense of deja-vu: we had a similar construct in the past that was removed as unnecessary. With additional new fields being added that only apply to instances, having a separate struct makes sense again. Updates #52728 Change-Id: I0bb5982d71c27e6b574bfb4f7b886a6aeb9c5390 Reviewed-on: https://go-review.googlesource.com/c/go/+/404884 Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
2022-03-21go/types, types2: factor out isInterface(x) && !isTypeParam(x) (cleanup)Robert Griesemer
Fixes #51581. Change-Id: I3232428edd7dd86f2930af950fb5841f7394c4e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/391834 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2022-02-23go/types, types2: add "dynamic" flag to comparable predicateRobert Griesemer
A type implements a comparable interface only if the type is statically known to be comparable. Specifically, a type cannot contain (component) interfaces that are not statically known to be comparable. This CL adds a flag "dynamic" to the comparable predicate to control whether interfaces are always (dynamically) comparable. Set the flag to true when testing for (traditional) Go comparability; set the flag to false when testing whether a type implements the comparable interface. Fixes #51257. Change-Id: If22bc047ee59337deb2e7844b8f488d67e5c5530 Reviewed-on: https://go-review.googlesource.com/c/go/+/387055 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>
2022-02-09go/types, types2: rename structuralType/String to coreType/StringRobert Griesemer
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>
2022-02-04go/types, types2: better error messages for comparisonsRobert Griesemer
Refactor Checker.comparison such that its logic is easier to reason about and so that special cases can be handled more directly. Use the appropriate operand (of 1st or 2nd operand) for error reporting (position and type), rather than always using the first operand. Use an extra parameter to indicate a switch case comparison; in this case the error is always reported at the position of the first operand. (The error messages are not yet adjusted for switches; see next CL.) Introduce a new kindString function which is used to print simplified types in error messages (related to comparisons only): instead of printing the details of a struct type, we just print "struct" where the details are not relevant. This matches the 1.17 compiler behavior. Added a "reportf" parameter to the internal comparable function so we can report an error cause in addition to the boolean result. Rather than passing a *string for cause, we pass a function to record the cause so that we can use the *Checker context for printing (needed for proper type qualification). This mechanism reports the same details now as the 1.17 compiler. Adjusted various tests as needed added new test files. Fixes #50918. Change-Id: I1f0e7af22f09db4d31679c667c71a9038a8dc9d2 Reviewed-on: https://go-review.googlesource.com/c/go/+/381964 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2022-01-31go/types, types2: fix implements and identical predicatesRobert Griesemer
- Use the correct predicate in Checker.implements: for interfaces we cannot use the API Comparable because it always returns true for all non-type parameter interface types: Comparable simply answers if == and != is permitted, and it's always been permitted for interfaces. Instead we must use Interface.IsComparable which looks at the type set of an interface. - When comparing interfaces for identity, we must also consider the whether the type sets have the comparable bit set. With this change, `any` doesn't implement `comparable` anymore. This only matters for generic functions and types, and the API functions. It does mean that for now (until we allow type-constrained interfaces for general non-constraint use, at some point in the future) a type parameter that needs to be comparable cannot be instantiated with an interface anymore. For #50646. Change-Id: I7e7f711bdcf94461f330c90509211ec0c2cf3633 Reviewed-on: https://go-review.googlesource.com/c/go/+/381254 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2022-01-24go/types, types2: pass the seen map through _TypeSet.IsComparableRobert Findley
While checking comparability of type parameters, we recurse through _TypeSet.IsComparable, but do not pass the cycle-tracking seen map, resulting in infinite recursion in some cases. Refactor to pass the seen map through this recursion. Fixes #50782 Change-Id: I2c2bcfed3398c11eb9aa0c871da59e348bfba5f7 Reviewed-on: https://go-review.googlesource.com/c/go/+/380504 Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org>
2021-12-15cmd/compile/internal/types2: externalize union type setsRobert Griesemer
This is a port of CL 371756 from go/types to types2 with minor adjustments due to different error handling or AST. Updates #50093 Change-Id: Iab6a4634f8fc917bf99df439d31098624085f52a Reviewed-on: https://go-review.googlesource.com/c/go/+/372474 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-11-22go/types, types2: substitute for type parameters in signatures whenRobert Findley
comparing type identity Generic signatures should be considered identical modulo type parameter renaming. Update Identical to reflect this, by substituting type parameters. Fixes #49722 Change-Id: I33743768c72d8aa59c29bf72fcbabc5974f0b805 Reviewed-on: https://go-review.googlesource.com/c/go/+/366178 Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org>
2021-11-16cmd/compile/internal/types2: use Identical to verify type identity in the ↵Robert Griesemer
Context map This is a clean port of CL 362798 from go/types to types2, with an additional comment adjustment in types2 and go/types. Change-Id: Ifa3d11f512f794f8ae2b6aca50b625a4a44672de Reviewed-on: https://go-review.googlesource.com/c/go/+/364135 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-11-13cmd/compile/internal/types2: remove tparamIsIface flag and corresponding ↵Robert Griesemer
dead code Added/clarified some comments. Change-Id: Ib08d3343ff08c23cc8880a27a0148d1ff077a80f Reviewed-on: https://go-review.googlesource.com/c/go/+/363654 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>
2021-11-13cmd/compile/internal/types2: underlying type of a type parameter is its ↵Robert Griesemer
constraint interface Until now, the type checker operated with the definition that the underlying type of a type parameter is itself. This leads to some inconcistencies and caused us to disallow type declarations where the RHS is a stand-alone type parameter. This change implements an alernative definition: the underlying type of a type parameter is the underlying type of its constraint; i.e., the underlying type of a type parameter is always an interface (because constraints must be interfaces). This matches the theory closely and also resolves some inconsistencies. For example, we don't need to prohibit stand-alone type parameters on the RHS of a type declaration (though, for the sake of keeping the tests the same, we still do in this CL). We also get a clear understanding of what it would mean to use a type assertion or type switch on a type parameter (still disabled with this CL). Finally, the declaration of a type parameter now very closely matches the definition of an ordinary type. The main consequence is that the rules for assignment need to be slightly modified: even though a type parameter is an interface, we cannot simply assign to it per the rules for interfaces: the type parameter's type is fixed for the instantiation and we need to reflect that accordingly when checking for assignability. This CL does not enable the new mode, it implements it in parallel to the existing mode; the internal flag tparamIsIface is used to switch between the modes. The changes to the code are numerous, but straight-forward: when- ever we deal with an underlying type that might be a type parameter (or newly, an interface), we need to act slightly differently. For the time being this leads to some code duplication because the code supports both modes. While some of the code for the new mode seems more complicated (e.g., when we have an interface, the code checks that it is not the underlying type of a type parameter), in reality many of the extra checks are redundant and only present because of an abundance of caution: interfaces with specific type sets are not permitted as types for ordinary variables, and so even if we were to hit those cases w/o excluding type parameters the behavior would be the same. Runs all tests with tparamIsIface enabled and disabled. Current setting: disabled. Change-Id: I7bb6453f4fe2569d92face222058fb4e17b12f25 Reviewed-on: https://go-review.googlesource.com/c/go/+/359016 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>
2021-11-12cmd/compile/internal/types2: make sure we are safe for nil in underIsRobert Griesemer
Reviewed all uses of underIs (global function and method) and made sure we are ok with a nil incoming argument (indicating a type set with no specific types). Added a couple of checks where we didn't have them (and somehow didn't run into a problem yet). Change-Id: Ifde45a3a80ddf2b1a19c83f79258ad8207dfb09f Reviewed-on: https://go-review.googlesource.com/c/go/+/363658 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-11-12cmd/compile/internal/types2: remove asTypeParam and simplify some codeRobert Griesemer
Because we do not permit a stand-alone type parameter on the RHS of a type declaration, the underlying type of a (Named) type cannot be a type parameter. This allows us to simplify some code. Specifically, when parsing union elements, we don't need to delay a check for later, which allows further simplifications when computing type sets. Change-Id: I4047c609f87ebb194ea8c1bad630a70d255b20cf Reviewed-on: https://go-review.googlesource.com/c/go/+/363438 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>
2021-11-10cmd/compile/internal/types2: rename structure to structuralTypeRobert Griesemer
And rename structureString to structuralString. Now that we have an updated definition for structural types in the (forthcoming) spec, name the corresponding function accordingly. No semantic changes. Change-Id: Iab838f01a37075bedf2d8bc4f166b0217672b85f Reviewed-on: https://go-review.googlesource.com/c/go/+/362994 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Go Bot <gobot@golang.org>
2021-11-09cmd/compile/internal/types2: roll-forward removal of asX convertersRobert Findley
This CL reverts CL 361964, rolling forward the original CL 362254 with a fix for re-entrant expansion via type hashing (compare patchsets 1 and 2). Change-Id: I62869e50e919f42eb8d6fef5b0d7a5ec8960bd84 Reviewed-on: https://go-review.googlesource.com/c/go/+/362118 Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org>
2021-11-08cmd/compile: Revert "cmd/compile/internal/types2: remove most asX converters ↵Cuong Manh Le
(cleanup)" This reverts commit 759eaa22adb0ab883959e4a36c19f2dfe77b5895. Reason to revert: break unified IR builder Though the unified IR is not for go1.18, it's the only user of types2 lazy resolution APIs at this moment. And it consistently failed after CL 362254 is the sign that the change was wrong somehow. Change-Id: I6bfc3192904fe2129fd3c165f0df8761e8eb441c Reviewed-on: https://go-review.googlesource.com/c/go/+/361964 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-11-08cmd/compile/internal/types2: remove most asX converters (cleanup)Robert Griesemer
Make it explicit in the code where we call under. The asNamed and asTypeParam converters need to stay: asNamed does resolution if necessary, and asTypeParam may or may not call under() depending on the next CL. Reviewed uses of asNamed and .(*Named) for correctness. Removed unnecessary Named.resolve call in lookup. Change-Id: I2acf176925e00bd1703a00230a779aa65a8f5a51 Reviewed-on: https://go-review.googlesource.com/c/go/+/362254 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-11-04cmd/compile/internal/types2: minor cleanups in predicates.goRobert Griesemer
- reordered some functions for better organization - renamed single arguments typ to t for consistency - updated some comments No functional changes. Change-Id: I4362ac48044595cdf5c3d9eb7b2f7b94e776d65b Reviewed-on: https://go-review.googlesource.com/c/go/+/360956 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-11-04cmd/compile/internal/types2: rename is_X predicates back to isX (step 2 of 2)Robert Griesemer
This is s/is_/is/ throughout. No other changes. Change-Id: I1be77a209133edc68a6dec0677a4991a7683f116 Reviewed-on: https://go-review.googlesource.com/c/go/+/361134 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-11-04cmd/compile/internal/types2: rename isX predicates to allX, add simple is_X ↵Robert Griesemer
(step 1 of 2) Rename the isX predicates to allX to clearly identify that these predicates are looking inside type parameters. Introduce is_X as predicates that do not look inside type parameters so we can see all call sites. The next CL will rename them all back to isX. Review all call sites and use correct predicate. Replace the single helper function is with isBasic and allBasic. Change-Id: I3430ccfc466fdedf4b58a6158f95d47b9020f7a5 Change-Id: I81116b87cf8f2e17526723c7440676d133057aca Reviewed-on: https://go-review.googlesource.com/c/go/+/360955 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-11-02cmd/compile/internal/types2: fix conversions of constants to type parameterRobert Griesemer
When converting a constant to a type parameter, the result is never constant (type parameters are not constant types), but we still need to verfy that the constant is representable by each specific type in the type set of the type parameter. Fixes #49247. Change-Id: I460983c7070b33baadce25dd23210e10930cfb2c Reviewed-on: https://go-review.googlesource.com/c/go/+/360396 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-10-28go/types, types2, go/ast, go/parser: remove support for type listsRobert Findley
This is a rough port of CL 354131 to go/* libraries, though in practice I just tried to reconcile any places where the phrase "type list" occurred in the source. This resulted in adjusting quite a bit more code than initially expected, including a few lingering cases in the compiler. Change-Id: Ie62a9e1aeb831b73931bc4c78bbb6ccb24f53fb0 Reviewed-on: https://go-review.googlesource.com/c/go/+/359135 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>
2021-10-27cmd/compile/internal/types2: rename isNamed predicate to hasNameRobert Griesemer
isNamed(t) is easily confused with asNamed(t) != nil (e.g., we have isPointer(t) that is defined as asPointer(t) != nil). This rename also helped clarifying a couple of places in the assignability rules where it makes sense to simply look for types that have names. Change-Id: Ie995908613a26883ffe0562343d297a1e981e9ef Reviewed-on: https://go-review.googlesource.com/c/go/+/358621 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-10-27cmd/compile/internal/types2: clean up asT converters (step 2 of 2)Robert Griesemer
This CL renames the toT converters back to their asT names. Change-Id: If4bda5a78525f9722f044f5544f400fa8bb6f437 Reviewed-on: https://go-review.googlesource.com/c/go/+/358774 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-10-27cmd/compile/internal/types2: clean up asT converters (step 1 of 2)Robert Griesemer
This CL changes the convenience converters asT to use under instead of optype. To make sure the effect is well understood, in a first step, all asT functions are renamed to toT so that we can see which call sites are affected. In almost all places, the change is what we want. In some places we may get more conservative behavior (which is easy to relax if need be). In some places (function calls through a type parameter, append built-in) we now use singleUnder instead, for a more general behavior, matching other primary expressions or built- ins. This change removes the last use of optype and thus also theTop and top, all of which have been deleted from the code. The next CL renames the toT converters back to their asT form. Change-Id: I35d1ad866ce46de175a055b36ef577d99bb9de22 Reviewed-on: https://go-review.googlesource.com/c/go/+/358597 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-09-15cmd/compile/internal/types2: implement Identical for *Union typesRobert Griesemer
This is a clean port of CL 349413 from go/types to types2. Change-Id: I18bad5e29b1e719b30a73fb2aa32fe252538496e Reviewed-on: https://go-review.googlesource.com/c/go/+/349992 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>
2021-09-15cmd/compile/internal/types2: remove some unnecessary loading/expansion of ↵Robert Griesemer
Named types This is a clean port of CL 349409 from go/types to types2. Change-Id: I2deb9ce46e6dcda736fda2169912c02163930d7d Reviewed-on: https://go-review.googlesource.com/c/go/+/349991 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>
2021-09-08cmd/compile/internal/types2: spell out 'Type' in type parameter APIsRobert Griesemer
This is a port of CL 348376 with the necessary adjustments in the compiler. Change-Id: Ib11ee841b194746ff231ee493aa56bf9b3a4a67f Reviewed-on: https://go-review.googlesource.com/c/go/+/348577 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
2021-08-24cmd/compile/internal/types2: use a TypeList type to hold type argumentsRobert Griesemer
This is a port of CL 343933 from go/types with the necessary adjustments in the compiler. With this CL type parameters and type lists are now held in TParamList and TypeList data types which don't expose the internal representation. Change-Id: I6d60881b5db995dbc04ed3f4a96e8b5d41f83969 Reviewed-on: https://go-review.googlesource.com/c/go/+/344615 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Dan Scales <danscales@google.com>
2021-08-24cmd/compile/internal/types2: use []*TypeParam rather than []*TypeName for ↵Robert Griesemer
type param lists This is a port of CL 343932 from go/types, with the necessary adjustments to the compiler. This change improves type safety slightly, avoids many internal type assertions, and simplifies some code paths. Change-Id: Ie9c4734814f49cd248927152d7b3264d3578428c Reviewed-on: https://go-review.googlesource.com/c/go/+/344614 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Dan Scales <danscales@google.com>