fix: handle function output value assigned to interface var
This commit is contained in:
19
_test/fun13.go
Normal file
19
_test/fun13.go
Normal 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>
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user