Commit ef4e12a4 authored by Ian Lance Taylor's avatar Ian Lance Taylor

reflect: test using a MakeFunc value in a couple of different ways

The gccgo implementation mishandled calling Interface on a
value created by MakeFunc.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/14401043
parent eb002c50
......@@ -1452,6 +1452,24 @@ func TestMakeFunc(t *testing.T) {
}
}
func TestMakeFuncInterface(t *testing.T) {
fn := func(i int) int { return i }
incr := func(in []Value) []Value {
return []Value{ValueOf(int(in[0].Int() + 1))}
}
fv := MakeFunc(TypeOf(fn), incr)
ValueOf(&fn).Elem().Set(fv)
if r := fn(2); r != 3 {
t.Errorf("Call returned %d, want 3", r)
}
if r := fv.Call([]Value{ValueOf(14)})[0].Int(); r != 15 {
t.Errorf("Call returned %d, want 15", r)
}
if r := fv.Interface().(func(int) int)(26); r != 27 {
t.Errorf("Call returned %d, want 27", r)
}
}
type Point struct {
x, y int
}
......
......@@ -22,7 +22,7 @@ type makeFuncImpl struct {
// that wraps the function fn. When called, that new function
// does the following:
//
// - converts its arguments to a list of Values args.
// - converts its arguments to a slice of Values.
// - runs results := fn(args).
// - returns the results as a slice of Values, one per formal result.
//
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment