From: Robert Griesemer Date: Wed, 31 Mar 2021 06:12:48 +0000 (-0700) Subject: cmd/compile/internal/types2: simplify Checker.Call X-Git-Tag: go1.17beta1~818 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d6a90d06d2;p=gostls13.git cmd/compile/internal/types2: simplify Checker.Call Now that we use square brackets for instantiations, we can tell type arguments from ordinary arguments without "guessing" which permits a simpler implementation. Specifically, replace use of Checker.exprOrTypeList with Checker.exprList, and delete Checker.exprOrTypeList and Checker.multiExprOrType. Disable a test for an (esoteric) failure due to an unrelated problem with error matching when running the test. Change-Id: I17f18fffc32f03fa90d93a68ebf56e5f2fcc9dab Reviewed-on: https://go-review.googlesource.com/c/go/+/306171 Trust: Robert Griesemer Reviewed-by: Robert Findley --- diff --git a/src/cmd/compile/internal/types2/call.go b/src/cmd/compile/internal/types2/call.go index 38e9015248..20649bed99 100644 --- a/src/cmd/compile/internal/types2/call.go +++ b/src/cmd/compile/internal/types2/call.go @@ -146,13 +146,7 @@ func (check *Checker) call(x *operand, call *syntax.CallExpr) exprKind { } // evaluate arguments - args, ok := check.exprOrTypeList(call.ArgList) - if !ok { - x.mode = invalid - x.expr = call - return expression - } - + args, _ := check.exprList(call.ArgList, false) sig = check.arguments(call, sig, args) // determine result @@ -183,60 +177,6 @@ func (check *Checker) call(x *operand, call *syntax.CallExpr) exprKind { } } -// exprOrTypeList returns a list of operands and reports an error if the -// list contains a mix of values and types (ignoring invalid operands). -// TODO(gri) Now we can split this into exprList and typeList. -func (check *Checker) exprOrTypeList(elist []syntax.Expr) (xlist []*operand, ok bool) { - ok = true - - switch len(elist) { - case 0: - // nothing to do - - case 1: - // single (possibly comma-ok) value or type, or function returning multiple values - e := elist[0] - var x operand - check.multiExprOrType(&x, e) - if t, ok := x.typ.(*Tuple); ok && x.mode != invalid && x.mode != typexpr { - // multiple values - xlist = make([]*operand, t.Len()) - for i, v := range t.vars { - xlist[i] = &operand{mode: value, expr: e, typ: v.typ} - } - break - } - - check.instantiatedOperand(&x) - - // exactly one (possibly invalid or comma-ok) value or type - xlist = []*operand{&x} - - default: - // multiple (possibly invalid) values or types - xlist = make([]*operand, len(elist)) - ntypes := 0 - for i, e := range elist { - var x operand - check.exprOrType(&x, e) - xlist[i] = &x - switch x.mode { - case invalid: - ntypes = len(xlist) // make 'if' condition fail below (no additional error in this case) - case typexpr: - ntypes++ - check.instantiatedOperand(&x) - } - } - if 0 < ntypes && ntypes < len(xlist) { - check.error(xlist[0], "mix of value and type expressions") - ok = false - } - } - - return -} - func (check *Checker) exprList(elist []syntax.Expr, allowCommaOk bool) (xlist []*operand, commaOk bool) { switch len(elist) { case 0: diff --git a/src/cmd/compile/internal/types2/expr.go b/src/cmd/compile/internal/types2/expr.go index 085c2f058c..7d2240d41e 100644 --- a/src/cmd/compile/internal/types2/expr.go +++ b/src/cmd/compile/internal/types2/expr.go @@ -1954,12 +1954,6 @@ func (check *Checker) multiExpr(x *operand, e syntax.Expr) { check.exclude(x, 1<