cmd/compile: support type C comparable

Support 'type C comparable' properly by using the same logic as for
'type T error', since ErrorType and ComparableType are entirely
analogous.

Added support for 'any' type as well, as requested by Robert. (For the
future - we can't currently have 'any' anywhere other than in a
constraint.)

Fixes #47966

Change-Id: I68bd284ced9a8bfca7d2339cd576f3cb909b1b83
Reviewed-on: https://go-review.googlesource.com/c/go/+/345174
Trust: Dan Scales <danscales@google.com>
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Dan Scales 2021-08-25 17:12:27 -07:00
parent 044550ab0e
commit d7a43e8912
6 changed files with 33 additions and 1 deletions

View file

@ -99,6 +99,9 @@ func predeclared() []*types.Type {
// comparable
types.ComparableType,
// any
types.AnyType,
}
}
return predecl

View file

@ -566,6 +566,14 @@ func (p *iexporter) doDecl(n *ir.Name) {
// for predeclared objects).
underlying = types.ErrorType
}
if underlying == types.ComparableType.Underlying() {
// Do same for ComparableType as for ErrorType.
underlying = types.ComparableType
}
if base.Flag.G > 0 && underlying == types.AnyType.Underlying() {
// Do same for AnyType as for ErrorType.
underlying = types.AnyType
}
w.typ(underlying)
t := n.Type()

View file

@ -119,6 +119,8 @@ var (
ErrorType *Type
// Predeclared comparable interface type.
ComparableType *Type
// Predeclared any interface type.
AnyType *Type
// Types to represent untyped string and boolean constants.
UntypedString = newType(TSTRING)

View file

@ -107,6 +107,14 @@ func InitTypes(defTypeName func(sym *Sym, typ *Type) Object) {
ComparableType.SetUnderlying(makeComparableInterface())
ResumeCheckSize()
// any type (interface)
if base.Flag.G > 0 {
DeferCheckSize()
AnyType = defBasic(TFORW, BuiltinPkg, "any")
AnyType.SetUnderlying(NewInterface(NoPkg, []*Field{}))
ResumeCheckSize()
}
Types[TUNSAFEPTR] = defBasic(TUNSAFEPTR, UnsafePkg, "Pointer")
Types[TBLANK] = newType(TBLANK)

View file

@ -0,0 +1,9 @@
// compile -G=3
// Copyright 2021 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.
package p
type C comparable

View file

@ -14,7 +14,9 @@ import (
"fmt"
)
type value[T comparable] struct {
type C comparable
type value[T C] struct {
val T
}