reflect: add a test for Calling a Method of a direct interface type

Gccgo's implementation of direct interface types has bugs that
causes reflect Call of method from Type.Method fail. CL 175837
and CL 175798 fix the bug. This CL adds a test.

Change-Id: I4e5f2cb96304c1ac7be04ca6d2851bac52b8eb24
Reviewed-on: https://go-review.googlesource.com/c/go/+/175880
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Cherry Zhang 2019-05-07 23:34:13 -04:00
parent 3403ee524b
commit 2d32d3675a
1 changed files with 33 additions and 0 deletions

View File

@ -2298,6 +2298,39 @@ func TestVariadicMethodValue(t *testing.T) {
}
}
type DirectIfaceT struct {
p *int
}
func (d DirectIfaceT) M() int { return *d.p }
func TestDirectIfaceMethod(t *testing.T) {
x := 42
v := DirectIfaceT{&x}
typ := TypeOf(v)
m, ok := typ.MethodByName("M")
if !ok {
t.Fatalf("cannot find method M")
}
in := []Value{ValueOf(v)}
out := m.Func.Call(in)
if got := out[0].Int(); got != 42 {
t.Errorf("Call with value receiver got %d, want 42", got)
}
pv := &v
typ = TypeOf(pv)
m, ok = typ.MethodByName("M")
if !ok {
t.Fatalf("cannot find method M")
}
in = []Value{ValueOf(pv)}
out = m.Func.Call(in)
if got := out[0].Int(); got != 42 {
t.Errorf("Call with pointer receiver got %d, want 42", got)
}
}
// Reflect version of $GOROOT/test/method5.go
// Concrete types implementing M method.