cmd/compile: convert arguments as needed

CL 114797 reworked how arguments get written to the stack.
Some type conversions got lost in the process. Restore them.

Fixes #28390
Updates #28430

Change-Id: Ia0d37428d7d615c865500bbd1a7a4167554ee34f
Reviewed-on: https://go-review.googlesource.com/c/144598
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2018-10-25 09:49:53 -07:00
parent a361ef36af
commit 15c4575293
4 changed files with 72 additions and 2 deletions

View file

@ -1772,10 +1772,22 @@ func walkCall(n *Node, init *Nodes) {
var tempAssigns []*Node
for i, arg := range args {
updateHasCall(arg)
if instrumenting || arg.HasCall() {
// Determine param type.
var t *types.Type
if n.Op == OCALLMETH {
if i == 0 {
t = n.Left.Type.Recv().Type
} else {
t = params.Field(i - 1).Type
}
} else {
t = params.Field(i).Type
}
if instrumenting || fncall(arg, t) {
// make assignment of fncall to tempname
tmp := temp(arg.Type)
tmp := temp(t)
a := nod(OAS, tmp, arg)
a = convas(a, init)
tempAssigns = append(tempAssigns, a)
// replace arg with temp
args[i] = tmp

View file

@ -0,0 +1,39 @@
// run
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Issue 28390/28430: Function call arguments were not
// converted correctly under some circumstances.
package main
import "fmt"
type A struct {
K int
S string
M map[string]string
}
func newA(k int, s string) (a A) {
a.K = k
a.S = s
a.M = make(map[string]string)
a.M[s] = s
return
}
func proxy() (x int, a A) {
return 1, newA(2, "3")
}
func consume(x int, a interface{}) {
fmt.Println(x)
fmt.Println(a) // used to panic here
}
func main() {
consume(proxy())
}

View file

@ -0,0 +1,2 @@
1
{2 3 map[3:3]}

View file

@ -0,0 +1,17 @@
// compile
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Issue 28390/28430: Function call arguments were not
// converted correctly under some circumstances.
package main
func g(_ interface{}, e error)
func h() (int, error)
func f() {
g(h())
}