diff options
author | Dan Scales <danscales@google.com> | 2021-03-15 10:27:06 -0700 |
---|---|---|
committer | Dan Scales <danscales@google.com> | 2021-03-16 18:42:06 +0000 |
commit | 832a01aad409dc0e41eabb53bfdb64d1a41b2c83 (patch) | |
tree | 4540978653a50809c849b650db5f681fef998deb /src/cmd/compile/internal/noder/types.go | |
parent | e31e84010e0989e1df4bd2c55d529497119bb345 (diff) | |
download | go-832a01aad409dc0e41eabb53bfdb64d1a41b2c83.tar.gz go-832a01aad409dc0e41eabb53bfdb64d1a41b2c83.zip |
cmd/compile: deal with comparable embedded in a constraint
Ignore an embedded type in an interface which is the predeclared
interface "comparable" (which currently can only be in a type
constraint), since the name doesn't resolve and the "comparable" type
doesn't have any relevant methods (for the purposes of the compiler).
Added new test case graph.go that needs this fix.
Change-Id: I2443d2c3dfeb9d0a78aaaaf91a2808ae2759d247
Reviewed-on: https://go-review.googlesource.com/c/go/+/301831
Trust: Dan Scales <danscales@google.com>
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder/types.go')
-rw-r--r-- | src/cmd/compile/internal/noder/types.go | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/noder/types.go b/src/cmd/compile/internal/noder/types.go index c5506ab4729..b196cb59453 100644 --- a/src/cmd/compile/internal/noder/types.go +++ b/src/cmd/compile/internal/noder/types.go @@ -181,11 +181,20 @@ func (g *irgen) typ0(typ types2.Type) *types.Type { case *types2.Interface: embeddeds := make([]*types.Field, typ.NumEmbeddeds()) + j := 0 for i := range embeddeds { // TODO(mdempsky): Get embedding position. e := typ.EmbeddedType(i) - embeddeds[i] = types.NewField(src.NoXPos, nil, g.typ1(e)) + if t := types2.AsInterface(e); t != nil && 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++ } + embeddeds = embeddeds[:j] methods := make([]*types.Field, typ.NumExplicitMethods()) for i := range methods { |