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:
wireChild(n)
l := len(n.child) - 1
switch n.child[l].kind {
switch lc := n.child[l]; lc.kind {
case callExpr:
n.gen = nop
case indexExpr:
n.child[l].gen = getIndexMap2
lc.gen = getIndexMap2
n.gen = nop
case typeAssertExpr:
if n.child[0].ident == "_" {
n.child[l].gen = typeAssertStatus
lc.gen = typeAssertStatus
} else {
n.child[l].gen = typeAssert2
lc.gen = typeAssert2
}
n.gen = nop
case unaryExpr:
if n.child[l].action == aRecv {
n.child[l].gen = recv2
if lc.action == aRecv {
lc.gen = recv2
n.gen = nop
}
}

View File

@@ -670,7 +670,12 @@ func call(n *node) {
case defineXStmt, assignXStmt:
for i := range rvalues {
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)
}
}