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 <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Robert Findley <rfindley@google.com>
diff --git a/src/cmd/compile/internal/types2/stmt.go b/src/cmd/compile/internal/types2/stmt.go
index 7fd7009..1984777 100644
--- a/src/cmd/compile/internal/types2/stmt.go
+++ b/src/cmd/compile/internal/types2/stmt.go
@@ -923,19 +923,26 @@
 				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 @@
 				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 30b4948..bfb51fd 100644
--- a/src/go/types/stmt.go
+++ b/src/go/types/stmt.go
@@ -923,19 +923,26 @@
 				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 @@
 				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