From b08393ce6db03dc9c3b8a34f5cf0c7994d59a44e Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 21 Mar 2017 15:15:34 -0700 Subject: [PATCH] go/gcimporter15: backport interface embedding support Backports golang.org/cl/38392 from go/internal/gcimporter. Updates golang/go#16369. Change-Id: Ic805f96e6565590987a5dae9f0f76c206fceab05 Reviewed-on: https://go-review.googlesource.com/38429 Run-TryBot: Matthew Dempsky Reviewed-by: Robert Griesemer --- go/gcimporter15/bimport.go | 9 +++++---- go/gcimporter15/gcimporter_test.go | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go/gcimporter15/bimport.go b/go/gcimporter15/bimport.go index 8bff64c3..3bec19c1 100644 --- a/go/gcimporter15/bimport.go +++ b/go/gcimporter15/bimport.go @@ -493,12 +493,13 @@ func (p *importer) typ(parent *types.Package) types.Type { p.record(nil) } - // no embedded interfaces with gc compiler - if p.int() != 0 { - errorf("unexpected embedded interface") + var embeddeds []*types.Named + for n := p.int(); n > 0; n-- { + p.pos() + embeddeds = append(embeddeds, p.typ(parent).(*types.Named)) } - t := types.NewInterface(p.methodList(parent), nil) + t := types.NewInterface(p.methodList(parent), embeddeds) if p.trackAllTypes { p.typList[n] = t } diff --git a/go/gcimporter15/gcimporter_test.go b/go/gcimporter15/gcimporter_test.go index 3e23c560..e29cb2c6 100644 --- a/go/gcimporter15/gcimporter_test.go +++ b/go/gcimporter15/gcimporter_test.go @@ -249,7 +249,7 @@ var importedObjectTests = []struct { }{ {"math.Pi", "const Pi untyped float"}, {"io.Reader", "type Reader interface{Read(p []byte) (n int, err error)}"}, - {"io.ReadWriter", "type ReadWriter interface{Read(p []byte) (n int, err error); Write(p []byte) (n int, err error)}"}, + {"io.ReadWriter", "type ReadWriter interface{Reader; Writer}"}, {"math.Sin", "func Sin(x float64) float64"}, // TODO(gri) add more tests }