Commit 15c45752 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

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: default avatarKeith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent a361ef36
...@@ -1772,10 +1772,22 @@ func walkCall(n *Node, init *Nodes) { ...@@ -1772,10 +1772,22 @@ func walkCall(n *Node, init *Nodes) {
var tempAssigns []*Node var tempAssigns []*Node
for i, arg := range args { for i, arg := range args {
updateHasCall(arg) 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 // make assignment of fncall to tempname
tmp := temp(arg.Type) tmp := temp(t)
a := nod(OAS, tmp, arg) a := nod(OAS, tmp, arg)
a = convas(a, init)
tempAssigns = append(tempAssigns, a) tempAssigns = append(tempAssigns, a)
// replace arg with temp // replace arg with temp
args[i] = tmp args[i] = tmp
......
// 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())
}
// 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())
}
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