mirror of https://github.com/golang/go.git
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:
parent
3403ee524b
commit
2d32d3675a
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue