39bc666430
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> |
||
---|---|---|
.github | ||
api | ||
doc | ||
lib/time | ||
misc | ||
src | ||
test | ||
.gitattributes | ||
.gitignore | ||
AUTHORS | ||
codereview.cfg | ||
CONTRIBUTING.md | ||
CONTRIBUTORS | ||
LICENSE | ||
PATENTS | ||
README.md | ||
SECURITY.md |
The Go Programming Language
Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
Gopher image by Renee French, licensed under Creative Commons 3.0 Attributions license.
Our canonical Git repository is located at https://go.googlesource.com/go. There is a mirror of the repository at https://github.com/golang/go.
Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file.
Download and Install
Binary Distributions
Official binary distributions are available at https://golang.org/dl/.
After downloading a binary release, visit https://golang.org/doc/install for installation instructions.
Install From Source
If a binary distribution is not available for your combination of operating system and architecture, visit https://golang.org/doc/install/source for source installation instructions.
Contributing
Go is the work of thousands of contributors. We appreciate your help!
To contribute, please read the contribution guidelines at https://golang.org/doc/contribute.
Note that the Go project uses the issue tracker for bug reports and proposals only. See https://golang.org/wiki/Questions for a list of places to ask questions about the Go language.