]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: add built-in name/type "comparable".
authorDan Scales <danscales@google.com>
Tue, 6 Jul 2021 03:58:56 +0000 (20:58 -0700)
committerDan Scales <danscales@google.com>
Wed, 7 Jul 2021 17:34:16 +0000 (17:34 +0000)
This allows exporting comparable type bounds, and importing back into
types2 for typechecking.

Fixes typeparam/mdempsky/8.go

Change-Id: I3ee12433df2ed68ac6ef4cad24be9fcdfaaca4e3
Reviewed-on: https://go-review.googlesource.com/c/go/+/333129
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Dan Scales <danscales@google.com>

src/cmd/compile/internal/importer/support.go
src/cmd/compile/internal/noder/types.go
src/cmd/compile/internal/typecheck/bexport.go
src/cmd/compile/internal/typecheck/universe.go
src/cmd/compile/internal/types/type.go
src/go/internal/gcimporter/support.go
test/run.go

index 3d1f77afcd02880438a0b54c2fe7cba5495d46f9..7eecae15a62d2e42ca0c0d25e2d33282dffaf8f4 100644 (file)
@@ -101,6 +101,8 @@ var predeclared = []types2.Type{
 
        // error
        types2.Universe.Lookup("error").Type(),
+       // comparable
+       types2.Universe.Lookup("comparable").Type(),
 
        // untyped types
        types2.Typ[types2.UntypedBool],
index a0b7fea7cb1c6ff8908396fe30eb2e8483757aba..d925f991c87ba0f823cf8a9e0c5ff8e0cc24b3ac 100644 (file)
@@ -189,14 +189,6 @@ func (g *irgen) typ0(typ types2.Type) *types.Type {
 
                        // With Go 1.18, an embedded element can be any type, not
                        // just an interface.
-                       if t := types2.AsInterface(e); t != nil {
-                               if t.IsComparable() {
-                                       // Ignore predefined type 'comparable', since it
-                                       // doesn't resolve and it doesn't have any
-                                       // relevant methods.
-                                       continue
-                               }
-                       }
                        embeddeds[j] = types.NewField(src.NoXPos, nil, g.typ1(e))
                        j++
                }
index 4a84bb13fa48ebfc63eb1dd36a5b7206af21a5c5..45d67f6ea23bc5302426d6c63a9c3cbffe1f5315 100644 (file)
@@ -78,6 +78,8 @@ func predeclared() []*types.Type {
 
                        // error
                        types.ErrorType,
+                       // comparable
+                       types.ComparableType,
 
                        // untyped types
                        types.UntypedBool,
index de185ab94471d640c834341e2a38432ff43acc09..54f3c89c24544cff2d1ad345726e9e74b4573274 100644 (file)
@@ -158,6 +158,15 @@ func InitUniverse() {
        s.Def = n
        types.CalcSize(types.ErrorType)
 
+       // comparable type (interface)
+       s = types.BuiltinPkg.Lookup("comparable")
+       n = ir.NewDeclNameAt(src.NoXPos, ir.OTYPE, s)
+       types.ComparableType = types.NewNamed(n)
+       types.ComparableType.SetUnderlying(makeComparableInterface())
+       n.SetType(types.ComparableType)
+       s.Def = n
+       types.CalcSize(types.ComparableType)
+
        types.Types[types.TUNSAFEPTR] = defBasic(types.TUNSAFEPTR, ir.Pkgs.Unsafe, "Pointer")
 
        // simple aliases
@@ -338,6 +347,12 @@ func makeErrorInterface() *types.Type {
        return types.NewInterface(types.NoPkg, []*types.Field{method})
 }
 
+func makeComparableInterface() *types.Type {
+       sig := types.NewSignature(types.NoPkg, fakeRecvField(), nil, nil, nil)
+       method := types.NewField(src.NoXPos, Lookup("=="), sig)
+       return types.NewInterface(types.NoPkg, []*types.Field{method})
+}
+
 // DeclareUniverse makes the universe block visible within the current package.
 func DeclareUniverse() {
        // Operationally, this is similar to a dot import of builtinpkg, except
index 7f7500079723ff606f84309c4d5dc948ffd62b6c..28312111adb8a3e1ea445239cbb57a1b38cf6508 100644 (file)
@@ -123,6 +123,8 @@ var (
 
        // Predeclared error interface type.
        ErrorType *Type
+       // Predeclared comparable interface type.
+       ComparableType *Type
 
        // Types to represent untyped string and boolean constants.
        UntypedString = New(TSTRING)
index b8bb14dc490e2a1a47e24adc60be69304e7414a3..bb2058172ac9fbea0649b0f71e47121f8116ca65 100644 (file)
@@ -104,6 +104,8 @@ var predeclared = []types.Type{
 
        // error
        types.Universe.Lookup("error").Type(),
+       // comparable
+       types.Universe.Lookup("comparable").Type(),
 
        // untyped types
        types.Typ[types.UntypedBool],
index 7afad0ec09c7f3ad4d8faffaa509695336f79caf..713e2006dc0ff27bd71e056192e70c7e23b2a2bc 100644 (file)
@@ -2210,7 +2210,6 @@ var g3Failures = setOf(
        "typeparam/mdempsky/4.go",
        "typeparam/mdempsky/5.go",
        "typeparam/mdempsky/7.go",
-       "typeparam/mdempsky/8.go",
        "typeparam/mdempsky/9.go",
        "typeparam/mdempsky/11.go",
        "typeparam/mdempsky/12.go",