From 2d32d3675ab88d6a3481b866afca4e2aea55210e Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 7 May 2019 23:34:13 -0400 Subject: [PATCH] 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 Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/reflect/all_test.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 2057530f07..0dbf4c5e87 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -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. -- 2.48.1