diff --git a/_test/fun13.go b/_test/fun13.go new file mode 100644 index 00000000..ab9d0037 --- /dev/null +++ b/_test/fun13.go @@ -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: +// {} diff --git a/interp/cfg.go b/interp/cfg.go index e5439da7..fe126739 100644 --- a/interp/cfg.go +++ b/interp/cfg.go @@ -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 } } diff --git a/interp/run.go b/interp/run.go index c85f72d8..1532fdd0 100644 --- a/interp/run.go +++ b/interp/run.go @@ -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) } }