aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder/types.go
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-03-15 10:27:06 -0700
committerDan Scales <danscales@google.com>2021-03-16 18:42:06 +0000
commit832a01aad409dc0e41eabb53bfdb64d1a41b2c83 (patch)
tree4540978653a50809c849b650db5f681fef998deb /src/cmd/compile/internal/noder/types.go
parente31e84010e0989e1df4bd2c55d529497119bb345 (diff)
downloadgo-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.go11
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 {