aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2020-12-15 17:48:51 -0800
committerRobert Griesemer <gri@golang.org>2020-12-16 17:49:13 +0000
commit3b5918c757eb32b4a05a0b4ba4bbab001175ebf0 (patch)
tree8f5ebe0b39aeba6dcc7e530dc5371b7d47797d8f /src/cmd/compile/internal
parent09abd23d9efecda2cec40ef6b8ca2cd93e220b40 (diff)
downloadgo-3b5918c757eb32b4a05a0b4ba4bbab001175ebf0.tar.xz
[dev.typeparams] cmd/compile/internal/types2: review of predicates.go
Make predicates.go match the corresponding and reviewed go/types version. The remaining diffs are due to the difference in the implementations of the type conversion methods/functions: $ diff $GOROOT/src/cmd/compile/internal/types2/predicates.go $GOROOT/src/go/types/predicates.go 7c7 < package types2 --- > package types 9a10 > "go/token" 32c33 < switch t := optype(typ.Under()).(type) { --- > switch t := optype(typ).(type) { 63c64 < // set up. Must not call Basic()! --- > // set up. Must not call asBasic()! 79c80 < t := typ.Basic() --- > t := asBasic(typ) 85c86 < return typ.Interface() != nil --- > return asInterface(typ) != nil 110c111 < if t := T.TypeParam(); t != nil && optype(t) == theTop { --- > if t := asTypeParam(T); t != nil && optype(t) == theTop { 114c115 < switch t := optype(T.Under()).(type) { --- > switch t := optype(T).(type) { 143c144 < switch t := optype(typ.Under()).(type) { --- > switch t := optype(typ).(type) { 300,301c301,302 < check.completeInterface(nopos, x) < check.completeInterface(nopos, y) --- > check.completeInterface(token.NoPos, x) > check.completeInterface(token.NoPos, y) Change-Id: I174d8a8a22fbd8814ede25002cb2705588912329 Reviewed-on: https://go-review.googlesource.com/c/go/+/278474 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src/cmd/compile/internal')
-rw-r--r--src/cmd/compile/internal/types2/predicates.go28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/cmd/compile/internal/types2/predicates.go b/src/cmd/compile/internal/types2/predicates.go
index 048519471c..b910d8d0ee 100644
--- a/src/cmd/compile/internal/types2/predicates.go
+++ b/src/cmd/compile/internal/types2/predicates.go
@@ -1,4 +1,3 @@
-// UNREVIEWED
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
@@ -21,7 +20,8 @@ func isNamed(typ Type) bool {
return false
}
-// isGeneric reports whether a type is a generic, uninstantiated type (generic signatures are not included).
+// isGeneric reports whether a type is a generic, uninstantiated type (generic
+// signatures are not included).
func isGeneric(typ Type) bool {
// A parameterized type is only instantiated if it doesn't have an instantiation already.
named, _ := typ.(*Named)
@@ -90,9 +90,16 @@ func Comparable(T Type) bool {
return comparable(T, nil)
}
-// comparable should only be called by Comparable.
func comparable(T Type, seen map[Type]bool) bool {
- // If T is a type parameter not constraint by any type
+ if seen[T] {
+ return true
+ }
+ if seen == nil {
+ seen = make(map[Type]bool)
+ }
+ seen[T] = true
+
+ // If T is a type parameter not constrained by any type
// list (i.e., it's underlying type is the top type),
// T is comparable if it has the == method. Otherwise,
// the underlying type "wins". For instance
@@ -104,14 +111,6 @@ func comparable(T Type, seen map[Type]bool) bool {
return t.Bound().IsComparable()
}
- if seen[T] {
- return true
- }
- if seen == nil {
- seen = make(map[Type]bool)
- }
- seen[T] = true
-
switch t := optype(T.Under()).(type) {
case *Basic:
// assume invalid types to be comparable
@@ -129,7 +128,10 @@ func comparable(T Type, seen map[Type]bool) bool {
case *Array:
return comparable(t.elem, seen)
case *Sum:
- return t.is(Comparable)
+ pred := func(t Type) bool {
+ return comparable(t, seen)
+ }
+ return t.is(pred)
case *TypeParam:
return t.Bound().IsComparable()
}