]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
reflect: Fix reflect.Call with function following non-pointer.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 1 Oct 2013 03:12:15 +0000 (03:12 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 1 Oct 2013 03:12:15 +0000 (03:12 +0000)
From-SVN: r203052

libgo/go/reflect/all_test.go
libgo/go/reflect/value.go

index 1fed58570f27219466c870fb871ff1c092416263..140a068b9cae32640d8290c043d415234da04fd3 100644 (file)
@@ -2406,6 +2406,15 @@ func TestVariadic(t *testing.T) {
        }
 }
 
+func TestFuncArg(t *testing.T) {
+       f1 := func(i int, f func(int) int) int { return f(i) }
+       f2 := func(i int) int { return i + 1 }
+       r := ValueOf(f1).Call([]Value{ValueOf(100), ValueOf(f2)})
+       if r[0].Int() != 101 {
+               t.Errorf("function returned %d, want 101", r[0].Int())
+       }
+}
+
 var tagGetTests = []struct {
        Tag   StructTag
        Key   string
index 9901ed6a4c6eb3fcb489299cbcb84528e1b9a1da..b199f70888c2848a595b34f512b11590109f0172 100644 (file)
@@ -433,7 +433,7 @@ func (v Value) call(op string, in []Value) []Value {
        if v.flag&flagMethod != 0 {
                nin++
        }
-       firstPointer := len(in) > 0 && Kind(t.In(0).(*rtype).kind) != Ptr && v.flag&flagMethod == 0 && isMethod(v.typ)
+       firstPointer := len(in) > 0 && t.In(0).Kind() != Ptr && v.flag&flagMethod == 0 && isMethod(v.typ)
        params := make([]unsafe.Pointer, nin)
        off := 0
        if v.flag&flagMethod != 0 {
@@ -497,8 +497,10 @@ func isMethod(t *rtype) bool {
        sawRet := false
        for i, c := range s {
                if c == '(' {
+                       if parens == 0 {
+                               params++
+                       }
                        parens++
-                       params++
                } else if c == ')' {
                        parens--
                } else if parens == 0 && c == ' ' && s[i+1] != '(' && !sawRet {