From: Robert Griesemer Date: Thu, 25 Apr 2024 16:21:14 +0000 (-0700) Subject: go/types, types2: refactor Checker.rangeStmt for clarity X-Git-Tag: go1.23rc1~524 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=fd99157f9d9c22eb35ea9c70f32908f0980d47ed;p=gostls13.git go/types, types2: refactor Checker.rangeStmt for clarity Change-Id: I0c2f921389416ab222b84f77699fd4b3246ef0e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/581776 Auto-Submit: Robert Griesemer Reviewed-by: Robert Griesemer LUCI-TryBot-Result: Go LUCI Reviewed-by: Robert Findley --- diff --git a/src/cmd/compile/internal/types2/stmt.go b/src/cmd/compile/internal/types2/stmt.go index 7fd7009e13..1984777008 100644 --- a/src/cmd/compile/internal/types2/stmt.go +++ b/src/cmd/compile/internal/types2/stmt.go @@ -923,19 +923,26 @@ func (check *Checker) rangeStmt(inner stmtContext, s *syntax.ForStmt, rclause *s check.errorf(lhs, InvalidSyntaxTree, "cannot declare %s", lhs) obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable } + assert(obj.typ == nil) + + // initialize lhs iteration variable, if any + typ := rhs[i] + if typ == nil { + obj.typ = Typ[Invalid] + obj.used = true // don't complain about unused variable + continue + } // initialize lhs variable if constIntRange { check.initVar(obj, &x, "range clause") - } else if typ := rhs[i]; typ != nil { + } else { x.mode = value x.expr = lhs // we don't have a better rhs expression to use here x.typ = typ check.initVar(obj, &x, "assignment") // error is on variable, use "assignment" not "range clause" - } else { - obj.typ = Typ[Invalid] - obj.used = true // don't complain about unused variable } + assert(obj.typ != nil) } // declare variables @@ -954,9 +961,15 @@ func (check *Checker) rangeStmt(inner stmtContext, s *syntax.ForStmt, rclause *s continue } + // assign to lhs iteration variable, if any + typ := rhs[i] + if typ == nil { + continue + } + if constIntRange { check.assignVar(lhs, nil, &x, "range clause") - } else if typ := rhs[i]; typ != nil { + } else { x.mode = value x.expr = lhs // we don't have a better rhs expression to use here x.typ = typ diff --git a/src/go/types/stmt.go b/src/go/types/stmt.go index 30b4948216..bfb51fd2e5 100644 --- a/src/go/types/stmt.go +++ b/src/go/types/stmt.go @@ -923,19 +923,26 @@ func (check *Checker) rangeStmt(inner stmtContext, s *ast.RangeStmt) { check.errorf(lhs, InvalidSyntaxTree, "cannot declare %s", lhs) obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable } + assert(obj.typ == nil) + + // initialize lhs iteration variable, if any + typ := rhs[i] + if typ == nil { + obj.typ = Typ[Invalid] + obj.used = true // don't complain about unused variable + continue + } // initialize lhs variable if constIntRange { check.initVar(obj, &x, "range clause") - } else if typ := rhs[i]; typ != nil { + } else { x.mode = value x.expr = lhs // we don't have a better rhs expression to use here x.typ = typ check.initVar(obj, &x, "assignment") // error is on variable, use "assignment" not "range clause" - } else { - obj.typ = Typ[Invalid] - obj.used = true // don't complain about unused variable } + assert(obj.typ != nil) } // declare variables @@ -954,9 +961,15 @@ func (check *Checker) rangeStmt(inner stmtContext, s *ast.RangeStmt) { continue } + // assign to lhs iteration variable, if any + typ := rhs[i] + if typ == nil { + continue + } + if constIntRange { check.assignVar(lhs, nil, &x, "range clause") - } else if typ := rhs[i]; typ != nil { + } else { x.mode = value x.expr = lhs // we don't have a better rhs expression to use here x.typ = typ