diff --git a/src/cmd/compile/internal/gc/bexport.go b/src/cmd/compile/internal/gc/bexport.go index 48b2b20156..2e5731e2b8 100644 --- a/src/cmd/compile/internal/gc/bexport.go +++ b/src/cmd/compile/internal/gc/bexport.go @@ -1256,26 +1256,35 @@ func (p *exporter) expr(n *Node) { p.expr(max) case OCOPY, OCOMPLEX: + // treated like other builtin calls (see e.g., OREAL) p.op(op) p.expr(n.Left) p.expr(n.Right) + p.op(OEND) case OCONV, OCONVIFACE, OCONVNOP, OARRAYBYTESTR, OARRAYRUNESTR, OSTRARRAYBYTE, OSTRARRAYRUNE, ORUNESTR: p.op(OCONV) p.typ(n.Type) - if p.bool(n.Left != nil) { + if n.Left != nil { p.expr(n.Left) + p.op(OEND) } else { - p.exprList(n.List) + p.exprList(n.List) // emits terminating OEND } case OREAL, OIMAG, OAPPEND, OCAP, OCLOSE, ODELETE, OLEN, OMAKE, ONEW, OPANIC, ORECOVER, OPRINT, OPRINTN: p.op(op) - if p.bool(n.Left != nil) { + if n.Left != nil { p.expr(n.Left) + p.op(OEND) } else { - p.exprList(n.List) + p.exprList(n.List) // emits terminating OEND + } + // only append() calls may contain '...' arguments + if op == OAPPEND { p.bool(n.Isddd) + } else if n.Isddd { + Fatalf("exporter: unexpected '...' with %s call", opnames[op]) } case OCALL, OCALLFUNC, OCALLMETH, OCALLINTER, OGETG: diff --git a/src/cmd/compile/internal/gc/bimport.go b/src/cmd/compile/internal/gc/bimport.go index 1bc184f7a4..5184753896 100644 --- a/src/cmd/compile/internal/gc/bimport.go +++ b/src/cmd/compile/internal/gc/bimport.go @@ -884,29 +884,18 @@ func (p *importer) node() *Node { n.SetSliceBounds(low, high, max) return n - case OCOPY, OCOMPLEX: - n := builtinCall(op) - n.List.Set([]*Node{p.expr(), p.expr()}) - return n - // case OCONV, OCONVIFACE, OCONVNOP, OARRAYBYTESTR, OARRAYRUNESTR, OSTRARRAYBYTE, OSTRARRAYRUNE, ORUNESTR: // unreachable - mapped to OCONV case below by exporter case OCONV: n := Nod(OCALL, typenod(p.typ()), nil) - if p.bool() { - n.List.Set1(p.expr()) - } else { - n.List.Set(p.exprList()) - } + n.List.Set(p.exprList()) return n - case OREAL, OIMAG, OAPPEND, OCAP, OCLOSE, ODELETE, OLEN, OMAKE, ONEW, OPANIC, ORECOVER, OPRINT, OPRINTN: + case OCOPY, OCOMPLEX, OREAL, OIMAG, OAPPEND, OCAP, OCLOSE, ODELETE, OLEN, OMAKE, ONEW, OPANIC, ORECOVER, OPRINT, OPRINTN: n := builtinCall(op) - if p.bool() { - n.List.Set1(p.expr()) - } else { - n.List.Set(p.exprList()) + n.List.Set(p.exprList()) + if op == OAPPEND { n.Isddd = p.bool() } return n