]> Cypherpunks.ru repositories - gostls13.git/commitdiff
go/types: rename isNamed predicate to hasName
authorRobert Findley <rfindley@google.com>
Tue, 2 Nov 2021 15:23:19 +0000 (11:23 -0400)
committerRobert Findley <rfindley@google.com>
Tue, 2 Nov 2021 21:18:39 +0000 (21:18 +0000)
This is a clean port of CL 358621 to go/types.

Change-Id: I4e858b1b70cff69b6e0e76bb8a58a70ff54990c9
Reviewed-on: https://go-review.googlesource.com/c/go/+/360755
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>
src/go/types/operand.go
src/go/types/predicates.go
src/go/types/testdata/spec/assignability.go2
src/go/types/unify.go

index 0ba3c4bafc42046e5cbb305a5f816e9f71d6cccb..a71449083f95d0930185fe9a1f0c98692624b4fe 100644 (file)
@@ -267,9 +267,8 @@ func (x *operand) assignableTo(check *Checker, T Type, reason *string) (bool, er
        // Vu is typed
 
        // x's type V and T have identical underlying types
-       // and at least one of V or T is not a named type
-       // and neither is a type parameter.
-       if Identical(Vu, Tu) && (!isNamed(V) || !isNamed(T)) && Vp == nil && Tp == nil {
+       // and at least one of V or T is not a named type.
+       if Identical(Vu, Tu) && (!hasName(V) || !hasName(T)) {
                return true, 0
        }
 
@@ -296,10 +295,10 @@ func (x *operand) assignableTo(check *Checker, T Type, reason *string) (bool, er
 
        // x is a bidirectional channel value, T is a channel
        // type, x's type V and T have identical element types,
-       // and at least one of V or T is not a named type
+       // and at least one of V or T is not a named type.
        if Vc, ok := Vu.(*Chan); ok && Vc.dir == SendRecv {
                if Tc, ok := Tu.(*Chan); ok && Identical(Vc.elem, Tc.elem) {
-                       return !isNamed(V) || !isNamed(T), _InvalidChanAssign
+                       return !hasName(V) || !hasName(T), _InvalidChanAssign
                }
        }
 
index b802682e8f030fbbcfdffed0648067eb8cdd28fc..2f74397d415b0f278c1649c3261afa92b18823f8 100644 (file)
@@ -8,9 +8,10 @@ package types
 
 import "go/token"
 
-// isNamed reports whether typ has a name.
-// isNamed may be called with types that are not fully set up.
-func isNamed(typ Type) bool {
+// hasName reports whether typ has a name. This includes
+// predeclared types, defined types, and type parameters.
+// hasName may be called with types that are not fully set up.
+func hasName(typ Type) bool {
        switch typ.(type) {
        case *Basic, *Named, *TypeParam:
                return true
index 4c6774b811c35d805e05d0cd2267eb2442d7c7a2..8ec878bf398ad8d9a1f940cc729110c3bfa48437 100644 (file)
@@ -33,8 +33,9 @@ func _[TP any](X TP) {
        X = X
 }
 
-// "x's type V and T have identical underlying types and at least one
-// of V or T is not a defined type and neither is a type parameter"
+// "x's type V and T have identical underlying types
+// and at least one of V or T is not a named type."
+// (here a named type is a type with a name)
 func _[TP1, TP2 Interface](X1 TP1, X2 TP2) {
        b = B // ERROR cannot use B .* as int value
        a = A
@@ -69,7 +70,8 @@ func _[TP Interface](X TP) {
        X = i // ERROR cannot use i .* as TP value
 }
 
-// "x is a bidirectional channel value, T is a channel type, x's type V and T have identical element types, and at least one of V or T is not a defined type"
+// "x is a bidirectional channel value, T is a channel type, x's type V and T have identical element types, and at least one of V or T is not a named type"
+// (here a named type is a type with a name)
 type (
        _SendChan = chan<- int
        _RecvChan = <-chan int
index 99c9c9e61416aaa7f79feda3dcadd1c226574bc8..d3b86008ef246a3c00d32fea18fcfff22efb93a2 100644 (file)
@@ -235,13 +235,13 @@ func (u *unifier) nify(x, y Type, p *ifacePair) bool {
                // If exact unification is known to fail because we attempt to
                // match a type name against an unnamed type literal, consider
                // the underlying type of the named type.
-               // (Subtle: We use isNamed to include any type with a name (incl.
-               // basic types and type parameters. We use asNamed() because we only
+               // (Subtle: We use hasName to include any type with a name (incl.
+               // basic types and type parameters. We use asNamed because we only
                // want *Named types.)
                switch {
-               case !isNamed(x) && y != nil && asNamed(y) != nil:
+               case !hasName(x) && y != nil && asNamed(y) != nil:
                        return u.nify(x, under(y), p)
-               case x != nil && asNamed(x) != nil && !isNamed(y):
+               case x != nil && asNamed(x) != nil && !hasName(y):
                        return u.nify(under(x), y, p)
                }
        }