From c013ed5b527924a0632babe1296849a63940fad5 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 20 Mar 2023 21:04:14 -0700 Subject: [PATCH] go/types, types2: refactor multiExpr and exprList Preparation for simpler exprList use. Change-Id: I2d62bbaba006aa3a378ec743564d46c5edcb8b47 Reviewed-on: https://go-review.googlesource.com/c/go/+/478016 Auto-Submit: Robert Griesemer Reviewed-by: Robert Findley Run-TryBot: Robert Griesemer Reviewed-by: Robert Griesemer TryBot-Result: Gopher Robot --- src/cmd/compile/internal/types2/call.go | 27 +------------------- src/cmd/compile/internal/types2/expr.go | 34 ++++++++++++++++++++++--- src/go/types/call.go | 27 +------------------- src/go/types/expr.go | 34 ++++++++++++++++++++++--- 4 files changed, 62 insertions(+), 60 deletions(-) diff --git a/src/cmd/compile/internal/types2/call.go b/src/cmd/compile/internal/types2/call.go index db83d58fcc..4a4c77decf 100644 --- a/src/cmd/compile/internal/types2/call.go +++ b/src/cmd/compile/internal/types2/call.go @@ -265,32 +265,8 @@ func (check *Checker) exprList(elist []syntax.Expr, allowCommaOk bool) (xlist [] switch len(elist) { case 0: // nothing to do - case 1: - // single (possibly comma-ok) value, or function returning multiple values - e := elist[0] - var x operand - check.multiExpr(&x, e) - if t, ok := x.typ.(*Tuple); ok && x.mode != invalid { - // multiple values - xlist = make([]*operand, t.Len()) - for i, v := range t.vars { - xlist[i] = &operand{mode: value, expr: e, typ: v.typ} - } - break - } - - // exactly one (possibly invalid or comma-ok) value - xlist = []*operand{&x} - if allowCommaOk && (x.mode == mapindex || x.mode == commaok || x.mode == commaerr) { - x2 := &operand{mode: value, expr: e, typ: Typ[UntypedBool]} - if x.mode == commaerr { - x2.typ = universeError - } - xlist = append(xlist, x2) - commaOk = true - } - + return check.multiExpr(elist[0], allowCommaOk) default: // multiple (possibly invalid) values xlist = make([]*operand, len(elist)) @@ -300,7 +276,6 @@ func (check *Checker) exprList(elist []syntax.Expr, allowCommaOk bool) (xlist [] xlist[i] = &x } } - return } diff --git a/src/cmd/compile/internal/types2/expr.go b/src/cmd/compile/internal/types2/expr.go index 2baa80c4fa..72c0186339 100644 --- a/src/cmd/compile/internal/types2/expr.go +++ b/src/cmd/compile/internal/types2/expr.go @@ -1816,10 +1816,36 @@ func (check *Checker) expr(x *operand, e syntax.Expr) { check.singleValue(x) } -// multiExpr is like expr but the result may also be a multi-value. -func (check *Checker) multiExpr(x *operand, e syntax.Expr) { - check.rawExpr(x, e, nil, false) - check.exclude(x, 1<