aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2023-06-14 10:55:06 -0400
committerGopher Robot <gobot@golang.org>2023-09-20 14:52:33 +0000
commita94347a05c74de989c9eb92d759ebc14eb12e021 (patch)
tree588575f78ac09a5bfd902b3e5cdea35235cfc7d9 /src/cmd/compile/internal/noder
parent8b727f856ebc812225f2a68c3b284dfabf6472a1 (diff)
downloadgo-a94347a05c74de989c9eb92d759ebc14eb12e021.tar.xz
cmd/compile: implement range over integer
Add compiler implementation of range over integers. This is only reachable if GOEXPERIMENT=range is set, because otherwise type checking will fail. For proposal #61405 (but behind a GOEXPERIMENT). For #61717. Change-Id: I4e35a73c5df1ac57f61ffb54033a433967e5be51 Reviewed-on: https://go-review.googlesource.com/c/go/+/510538 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Auto-Submit: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder')
-rw-r--r--src/cmd/compile/internal/noder/writer.go26
1 files changed, 1 insertions, 25 deletions
diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go
index 79c884c22f..f68a3875df 100644
--- a/src/cmd/compile/internal/noder/writer.go
+++ b/src/cmd/compile/internal/noder/writer.go
@@ -1448,7 +1448,7 @@ func (w *writer) forStmt(stmt *syntax.ForStmt) {
w.convRTTI(src, dstType)
}
- keyType, valueType := w.p.rangeTypes(rang.X)
+ keyType, valueType := types2.RangeKeyVal(w.p.typeOf(rang.X))
assign(0, keyType)
assign(1, valueType)
}
@@ -1489,30 +1489,6 @@ func (w *writer) distinctVars(stmt *syntax.ForStmt) bool {
return is122 || lv > 0 && lv != 3
}
-// rangeTypes returns the types of values produced by ranging over
-// expr.
-func (pw *pkgWriter) rangeTypes(expr syntax.Expr) (key, value types2.Type) {
- typ := pw.typeOf(expr)
- switch typ := types2.CoreType(typ).(type) {
- case *types2.Pointer: // must be pointer to array
- return types2.Typ[types2.Int], types2.CoreType(typ.Elem()).(*types2.Array).Elem()
- case *types2.Array:
- return types2.Typ[types2.Int], typ.Elem()
- case *types2.Slice:
- return types2.Typ[types2.Int], typ.Elem()
- case *types2.Basic:
- if typ.Info()&types2.IsString != 0 {
- return types2.Typ[types2.Int], runeTypeName.Type()
- }
- case *types2.Map:
- return typ.Key(), typ.Elem()
- case *types2.Chan:
- return typ.Elem(), nil
- }
- pw.fatalf(expr, "unexpected range type: %v", typ)
- panic("unreachable")
-}
-
func (w *writer) ifStmt(stmt *syntax.IfStmt) {
cond := w.p.staticBool(&stmt.Cond)