From 5bf4daef2d605e48ee391acc3f920b97c52e5f78 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Fri, 8 Oct 2021 17:44:09 +0200 Subject: [PATCH] interp: fix type check of methods with a receiver of interface kind Fixes #1280. --- _test/issue-1280.go | 30 ++++++++++++++++++++++++++++++ interp/type.go | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 _test/issue-1280.go diff --git a/_test/issue-1280.go b/_test/issue-1280.go new file mode 100644 index 00000000..bac51e37 --- /dev/null +++ b/_test/issue-1280.go @@ -0,0 +1,30 @@ +package main + +import ( + "io" + "log" + "os" +) + +type DBReader interface { + io.ReadCloser + io.ReaderAt +} + +type DB struct { + f DBReader +} + +func main() { + f, err := os.Open("/dev/null") + if err != nil { + log.Fatal(err) + } + d := &DB{f} + data := make([]byte, 1) + _, _ = d.f.ReadAt(data, 0) + println("bye") +} + +// Output: +// bye diff --git a/interp/type.go b/interp/type.go index eff7ae23..2deddf16 100644 --- a/interp/type.go +++ b/interp/type.go @@ -1071,7 +1071,7 @@ func (t *itype) in(i int) *itype { return t.arg[i] case valueT: if t.rtype.Kind() == reflect.Func { - if t.recv != nil { + if t.recv != nil && !isInterface(t.recv) { i++ } if t.rtype.IsVariadic() && i == t.rtype.NumIn()-1 {