From 2cb01a397200b182e28f9d91dfde104e3a3895d1 Mon Sep 17 00:00:00 2001
From: Ian Lance Taylor <ian@gcc.gnu.org>
Date: Tue, 1 Oct 2013 03:12:15 +0000
Subject: [PATCH] reflect: Fix reflect.Call with function following
 non-pointer.

From-SVN: r203052
---
 libgo/go/reflect/all_test.go | 9 +++++++++
 libgo/go/reflect/value.go    | 6 ++++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/libgo/go/reflect/all_test.go b/libgo/go/reflect/all_test.go
index 1fed58570f27..140a068b9cae 100644
--- a/libgo/go/reflect/all_test.go
+++ b/libgo/go/reflect/all_test.go
@@ -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
diff --git a/libgo/go/reflect/value.go b/libgo/go/reflect/value.go
index 9901ed6a4c6e..b199f70888c2 100644
--- a/libgo/go/reflect/value.go
+++ b/libgo/go/reflect/value.go
@@ -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 {
-- 
GitLab