From patchwork Tue Oct 1 03:12:33 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 279319 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 56DB02C00B6 for ; Tue, 1 Oct 2013 13:12:48 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type; q=dns; s= default; b=x6C6A7khJQnwzrl4IzZX99q9+SaBO6wHLmvLX6vGDe8cIu4EubGSO +hxhg6jYJkhtyCR4HREUImyW1vW2Oxabpm+5ifa6vek+JQMEOVkQBz0vsLV8pE8O 5tIOEs6fg5NMx0gqRKH+LWv/gq7JyeW7G9sdmz1Z1ZwNuiEddO8ea8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type; s= default; bh=5Vh8wgAkmEh2s8T/WpkYXp4PiDc=; b=skvRFwgDF6aBB18jEGI3 +lcyC5TZtTFwtFKfM9OB4csxFVuseaBgn+K063JJniCOQE19jZmU7Grnu6yeeqaZ 07UA+3PIfirtEkUup/9oAEuOSOJzaVxJaleOAiCfOeiJiZedyN0FoPjqWepoO1SE JX7lq7XIkn89Oe+02F7gd0M= Received: (qmail 9749 invoked by alias); 1 Oct 2013 03:12:40 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 9733 invoked by uid 89); 1 Oct 2013 03:12:39 -0000 Received: from mail-pa0-f48.google.com (HELO mail-pa0-f48.google.com) (209.85.220.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 01 Oct 2013 03:12:39 +0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=ALL_TRUSTED, AWL, BAYES_00, T_TVD_MIME_NO_HEADERS autolearn=ham version=3.3.2 X-HELO: mail-pa0-f48.google.com Received: by mail-pa0-f48.google.com with SMTP id bj1so6754752pad.35 for ; Mon, 30 Sep 2013 20:12:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:user-agent :mime-version:content-type; bh=OK25YdT12M1KCuBdPKA/aeREWhhPHlGDDMqNrXzS8HI=; b=Ugu9vcab3Z23aJGuVjLPVRIlvzHc2BKjpcBuZcEm7e1tUtChehWG7Jk2bdcZiTHB3m Zj5Au4lOlqRakmz1kl7VMLQnuRirYgnvreihdkaKP25MVQdk/dT+D2fd1HGnFxkxovo6 upMZ7DWdjBYyE2HjAReAB41+PHzxKX+Kah6nKohgg6CymkU/IMDDjkwOef0CkxtIm0RE U4AuNr7vkIzu4VfGvD0l0o6aSdQ229NVN3zBEowJp5JFqb2mYQ9E2AX3Vq6tLERmdaAB fd4HXkSYGk0NV5rBlgIzz1bU5WlfokFj57qlA4NLPq5ExZXCuC1BipmfNFFWJnuADjlx dFZg== X-Gm-Message-State: ALoCoQlfuxnBqMNDIzi0qEpynxnH/STIIg3VVGTbJMWQ0CLegUNDHEE6htY7rxEenA+wM1oy521UKIbB5YTml62sBVhLLAW2Vs2zd5Ym4W7DElIAVqPFzAvOR50e3tS7FAcAq+hKvvNNBpwnKzr/gnREIB39SGnwvLJFt+JQWG6cQFfet3m6uKH53fzTo+Gr6sJmyUOE+/t/a+IXHelxjW1m0xaTzbJTMg== X-Received: by 10.68.189.229 with SMTP id gl5mr18294pbc.195.1380597156538; Mon, 30 Sep 2013 20:12:36 -0700 (PDT) Received: from iant-glaptop.roam.corp.google.com.google.com ([172.29.167.242]) by mx.google.com with ESMTPSA id l8sm3810633pbl.22.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 30 Sep 2013 20:12:35 -0700 (PDT) From: Ian Lance Taylor To: gcc-patches@gcc.gnu.org, gofrontend-dev@googlegroups.com Subject: libgo patch committed: Fix reflect.Call passing function Date: Mon, 30 Sep 2013 20:12:33 -0700 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes There was a bug in the libgo implementation of reflect.Call when passing a function following a non-pointer type. This patch fixes the bug and adds a test. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline and 4.8 branch. Ian diff -r 7c369498bb81 libgo/go/reflect/all_test.go --- a/libgo/go/reflect/all_test.go Mon Sep 30 11:06:06 2013 -0700 +++ b/libgo/go/reflect/all_test.go Mon Sep 30 20:03:54 2013 -0700 @@ -2406,6 +2406,15 @@ } } +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 -r 7c369498bb81 libgo/go/reflect/value.go --- a/libgo/go/reflect/value.go Mon Sep 30 11:06:06 2013 -0700 +++ b/libgo/go/reflect/value.go Mon Sep 30 20:03:54 2013 -0700 @@ -433,7 +433,7 @@ 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 @@ 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 {