fix: handle function output value assigned to interface var

This commit is contained in:
Marc Vertes
2020-04-25 17:28:04 +02:00
committed by GitHub
parent a6389aca5e
commit 92eebbade2
3 changed files with 31 additions and 7 deletions

19
_test/fun13.go Normal file
View File

@@ -0,0 +1,19 @@
package main
import "fmt"
type T struct{}
func newT() (T, error) { return T{}, nil }
func main() {
var (
i interface{}
err error
)
i, err = newT()
fmt.Println(i, err)
}
// Output:
// {} <nil>

View File

@@ -542,22 +542,22 @@ func (interp *Interpreter) cfg(root *node, pkgID string) ([]*node, error) {
case assignXStmt: case assignXStmt:
wireChild(n) wireChild(n)
l := len(n.child) - 1 l := len(n.child) - 1
switch n.child[l].kind { switch lc := n.child[l]; lc.kind {
case callExpr: case callExpr:
n.gen = nop n.gen = nop
case indexExpr: case indexExpr:
n.child[l].gen = getIndexMap2 lc.gen = getIndexMap2
n.gen = nop n.gen = nop
case typeAssertExpr: case typeAssertExpr:
if n.child[0].ident == "_" { if n.child[0].ident == "_" {
n.child[l].gen = typeAssertStatus lc.gen = typeAssertStatus
} else { } else {
n.child[l].gen = typeAssert2 lc.gen = typeAssert2
} }
n.gen = nop n.gen = nop
case unaryExpr: case unaryExpr:
if n.child[l].action == aRecv { if lc.action == aRecv {
n.child[l].gen = recv2 lc.gen = recv2
n.gen = nop n.gen = nop
} }
} }

View File

@@ -670,7 +670,12 @@ func call(n *node) {
case defineXStmt, assignXStmt: case defineXStmt, assignXStmt:
for i := range rvalues { for i := range rvalues {
c := n.anc.child[i] c := n.anc.child[i]
if c.ident != "_" { switch {
case c.ident == "_":
// Skip assigning return value to blank var.
case c.typ.cat == interfaceT:
rvalues[i] = genValueInterfaceValue(c)
default:
rvalues[i] = genValue(c) rvalues[i] = genValue(c)
} }
} }