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>
// comparable
types.ComparableType,
+
+ // any
+ types.AnyType,
}
}
return predecl
// 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()
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)
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)
--- /dev/null
+// 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
"fmt"
)
-type value[T comparable] struct {
+type C comparable
+
+type value[T C] struct {
val T
}