interp: fix calling of variadic binary methods

Fixes #1046.
This commit is contained in:
Marc Vertes
2021-05-22 11:48:07 +02:00
committed by GitHub
parent fbf897b047
commit 847cd7ed2b
2 changed files with 25 additions and 2 deletions

View File

@@ -66,3 +66,26 @@ func NewMyInt(i int) wrap.Wrap {
w := NewMyInt(4)
Hi(w)
}
type T struct{}
func (t T) Bar(s ...string) {}
func TestCallBinVariadicMethod(t *testing.T) {
i := interp.New(interp.Options{})
i.Use(interp.Exports{
"mypkg/mypkg": {
"T": reflect.ValueOf((*T)(nil)),
},
})
eval(t, i, `
package p
import "mypkg"
func Foo(x mypkg.T) { x.Bar("s") }
`)
v := eval(t, i, "p.Foo")
bar := v.Interface().(func(t T))
bar(T{})
}

View File

@@ -1350,7 +1350,7 @@ func callBin(n *node) {
for i, c := range child {
var defType reflect.Type
if variadic >= 0 && i >= variadic {
if variadic >= 0 && i+rcvrOffset >= variadic {
defType = funcType.In(variadic)
} else {
defType = funcType.In(rcvrOffset + i)
@@ -1374,7 +1374,7 @@ func callBin(n *node) {
if c.kind == basicLit || c.rval.IsValid() {
// Convert literal value (untyped) to function argument type (if not an interface{})
var argType reflect.Type
if variadic >= 0 && i >= variadic {
if variadic >= 0 && i+rcvrOffset >= variadic {
argType = funcType.In(variadic).Elem()
} else {
argType = funcType.In(i + rcvrOffset)