diff options
Diffstat (limited to 'src/go/types/predicates.go')
-rw-r--r-- | src/go/types/predicates.go | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/go/types/predicates.go b/src/go/types/predicates.go index 07d07f9f12..1889694342 100644 --- a/src/go/types/predicates.go +++ b/src/go/types/predicates.go @@ -82,22 +82,30 @@ func isTypeLit(t Type) bool { } // isTyped reports whether t is typed; i.e., not an untyped -// constant or boolean. isTyped may be called with types that -// are not fully set up. +// constant or boolean. +// Safe to call from types that are not fully set up. func isTyped(t Type) bool { - // Alias or Named types cannot denote untyped types, - // thus we don't need to call Unalias or under - // (which would be unsafe to do for types that are - // not fully set up). + // Alias and named types cannot denote untyped types + // so there's no need to call Unalias or under, below. b, _ := t.(*Basic) return b == nil || b.info&IsUntyped == 0 } // isUntyped(t) is the same as !isTyped(t). +// Safe to call from types that are not fully set up. func isUntyped(t Type) bool { return !isTyped(t) } +// isUntypedNumeric reports whether t is an untyped numeric type. +// Safe to call from types that are not fully set up. +func isUntypedNumeric(t Type) bool { + // Alias and named types cannot denote untyped types + // so there's no need to call Unalias or under, below. + b, _ := t.(*Basic) + return b != nil && b.info&IsUntyped != 0 && b.info&IsNumeric != 0 +} + // IsInterface reports whether t is an interface type. func IsInterface(t Type) bool { _, ok := under(t).(*Interface) @@ -542,7 +550,7 @@ func maxType(x, y Type) Type { if x == y { return x } - if isUntyped(x) && isUntyped(y) && isNumeric(x) && isNumeric(y) { + if isUntypedNumeric(x) && isUntypedNumeric(y) { // untyped types are basic types if x.(*Basic).kind > y.(*Basic).kind { return x |