1
0
mirror of https://github.com/golang/go synced 2024-11-26 08:48:13 -07:00

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 // comparable
types.ComparableType, types.ComparableType,
// any
types.AnyType,
} }
} }
return predecl return predecl

View File

@ -566,6 +566,14 @@ func (p *iexporter) doDecl(n *ir.Name) {
// for predeclared objects). // for predeclared objects).
underlying = types.ErrorType 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) w.typ(underlying)
t := n.Type() t := n.Type()

View File

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

View File

@ -107,6 +107,14 @@ func InitTypes(defTypeName func(sym *Sym, typ *Type) Object) {
ComparableType.SetUnderlying(makeComparableInterface()) ComparableType.SetUnderlying(makeComparableInterface())
ResumeCheckSize() 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[TUNSAFEPTR] = defBasic(TUNSAFEPTR, UnsafePkg, "Pointer")
Types[TBLANK] = newType(TBLANK) 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" "fmt"
) )
type value[T comparable] struct { type C comparable
type value[T C] struct {
val T val T
} }