1
0
mirror of https://github.com/golang/go synced 2024-11-23 00:10:07 -07:00

go/types, types2: remove superfluous argument test in Checker.arguments

There's only two places which call Checker.arguments: Checker.callExpr
and Checker.builtin. Both ensure that the passed argument list doesn't
contain type expressions, so we don't need that extra check at the start
of Checker.arguments.

The remaining check causes Checker.arguments to exit early if any of
the passed arguments is invalid. This reduces the number of reported
errors in rare cases but is executed all the time.
If the extra errors are a problem, it would be better to not call
Checker.arguments in the first place, or only do the extra check
before Checker.arguments reports an error.

Removing this code for now. Removes a long-standing TODO.

Change-Id: Ief654b680eb6b6a768bb1b4c621d3c8169953f17
Reviewed-on: https://go-review.googlesource.com/c/go/+/495395
Run-TryBot: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Robert Griesemer 2023-05-16 11:34:14 -07:00 committed by Gopher Robot
parent d29dd2ecf7
commit 522be4e010
4 changed files with 2 additions and 24 deletions

View File

@ -419,17 +419,6 @@ func (check *Checker) genericExprList(elist []syntax.Expr) []*operand {
func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, targs []Type, xlist []syntax.Expr, args []*operand) (rsig *Signature) {
rsig = sig
// TODO(gri) try to eliminate this extra verification loop
for _, a := range args {
switch a.mode {
case typexpr:
check.errorf(a, NotAnExpr, "%s used as value", a)
return
case invalid:
return
}
}
// Function call argument/parameter count requirements
//
// | standard call | dotdotdot call |

View File

@ -424,17 +424,6 @@ func (check *Checker) genericExprList(elist []ast.Expr) []*operand {
func (check *Checker) arguments(call *ast.CallExpr, sig *Signature, targs []Type, xlist []ast.Expr, args []*operand) (rsig *Signature) {
rsig = sig
// TODO(gri) try to eliminate this extra verification loop
for _, a := range args {
switch a.mode {
case typexpr:
check.errorf(a, NotAnExpr, "%s used as value", a)
return
case invalid:
return
}
}
// Function call argument/parameter count requirements
//
// | standard call | dotdotdot call |

View File

@ -505,7 +505,7 @@ func _calls() {
f2(3.14) /* ERROR "not enough arguments in call to f2\n\thave (number)\n\twant (float32, string)" */
f2(3.14, "foo")
f2(x /* ERRORx `cannot use .* in argument` */ , "foo")
f2(g0 /* ERROR "used as value" */ ())
f2(g0 /* ERROR "used as value" */ ()) /* ERROR "not enough arguments in call to f2\n\thave (func())\n\twant (float32, string)" */
f2(g1()) /* ERROR "not enough arguments in call to f2\n\thave (int)\n\twant (float32, string)" */
f2(g2())

View File

@ -66,7 +66,7 @@ type Z19 [][[]Z19{}[0][0]]c19 /* ERROR "undefined" */
// crash 20
type Z20 /* ERROR "invalid recursive type" */ interface{ Z20 }
func F20[t Z20]() { F20(t /* ERROR "invalid composite literal type" */ {}) }
func F20[t Z20]() { F20(t /* ERROR "invalid composite literal type" */ /* ERROR "too many arguments in call to F20\n\thave (unknown type)\n\twant ()" */ {}) }
// crash 21
type Z21 /* ERROR "invalid recursive type" */ interface{ Z21 }