diff options
| author | Russ Cox <rsc@golang.org> | 2023-06-14 10:55:06 -0400 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-09-20 14:52:33 +0000 |
| commit | a94347a05c74de989c9eb92d759ebc14eb12e021 (patch) | |
| tree | 588575f78ac09a5bfd902b3e5cdea35235cfc7d9 /src/cmd/compile/internal/noder | |
| parent | 8b727f856ebc812225f2a68c3b284dfabf6472a1 (diff) | |
| download | go-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.go | 26 |
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) |
