mirror of
https://github.com/golang/go
synced 2024-11-26 20:31:25 -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:
parent
044550ab0e
commit
d7a43e8912
@ -99,6 +99,9 @@ func predeclared() []*types.Type {
|
||||
|
||||
// comparable
|
||||
types.ComparableType,
|
||||
|
||||
// any
|
||||
types.AnyType,
|
||||
}
|
||||
}
|
||||
return predecl
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
9
test/typeparam/issue47966.go
Normal file
9
test/typeparam/issue47966.go
Normal 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
|
@ -14,7 +14,9 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type value[T comparable] struct {
|
||||
type C comparable
|
||||
|
||||
type value[T C] struct {
|
||||
val T
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user