aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/types2/type.go
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2021-07-29 11:10:04 -0700
committerRobert Griesemer <gri@golang.org>2021-08-05 19:36:47 +0000
commitbb5608dd5d056519bd90666b815e0b2bf65e5ee8 (patch)
treece15dcdb79b6a54969dda7ec002a630c71ff40fb /src/cmd/compile/internal/types2/type.go
parent6dadee759c812961300c8d1a44959d14299fd9f8 (diff)
downloadgo-bb5608dd5d056519bd90666b815e0b2bf65e5ee8.tar.gz
go-bb5608dd5d056519bd90666b815e0b2bf65e5ee8.zip
[dev.typeparams] cmd/compile/internal/types2: implement type sets with term lists
This CL resolves several known issues and TODOs. - Represent type sets with term lists and using term list abstractions. - Represent Unions internally as a list of (syntactical) terms. Use term operations to print terms and detect overlapping union entries. - Compute type sets corresponding to unions lazily, on demand. - Adjust code throughout. - Adjusted error check in test/typeparam/mincheck.dir/main.go to make test pass. Change-Id: Ib36fb7e1d343c2b6aec51d304f0f7d1ad415f999 Reviewed-on: https://go-review.googlesource.com/c/go/+/338310 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src/cmd/compile/internal/types2/type.go')
-rw-r--r--src/cmd/compile/internal/types2/type.go21
1 files changed, 7 insertions, 14 deletions
diff --git a/src/cmd/compile/internal/types2/type.go b/src/cmd/compile/internal/types2/type.go
index a943926189..7ae2db3412 100644
--- a/src/cmd/compile/internal/types2/type.go
+++ b/src/cmd/compile/internal/types2/type.go
@@ -44,28 +44,21 @@ func under(t Type) Type {
// optype returns a type's operational type. Except for
// type parameters, the operational type is the same
// as the underlying type (as returned by under). For
-// Type parameters, the operational type is determined
-// by the corresponding type bound's type list. The
-// result may be the bottom or top type, but it is never
-// the incoming type parameter.
+// Type parameters, the operational type is the structural
+// type, if any; otherwise it's the top type.
+// The result is never the incoming type parameter.
func optype(typ Type) Type {
if t := asTypeParam(typ); t != nil {
+ // TODO(gri) review accuracy of this comment
// If the optype is typ, return the top type as we have
// no information. It also prevents infinite recursion
// via the asTypeParam converter function. This can happen
// for a type parameter list of the form:
// (type T interface { type T }).
// See also issue #39680.
- if a := t.iface().typeSet().types; a != nil {
- // If we have a union with a single entry, ignore
- // any tilde because under(~t) == under(t).
- if u, _ := a.(*Union); u != nil && u.NumTerms() == 1 {
- a, _ = u.Term(0)
- }
- if a != typ {
- // a != typ and a is a type parameter => under(a) != typ, so this is ok
- return under(a)
- }
+ if u := t.structuralType(); u != nil {
+ assert(u != typ) // "naked" type parameters cannot be embedded
+ return u
}
return theTop
}