]> Cypherpunks.ru repositories - gostls13.git/commitdiff
go/types, types2: enable range over int w/o need for goexperiment
authorRobert Griesemer <gri@golang.org>
Tue, 31 Oct 2023 23:13:21 +0000 (16:13 -0700)
committerGopher Robot <gobot@golang.org>
Thu, 2 Nov 2023 04:17:18 +0000 (04:17 +0000)
For #61405.

Change-Id: I047ec31bc36b1707799ffef25506070613477d1f
Reviewed-on: https://go-review.googlesource.com/c/go/+/538718
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
src/cmd/compile/internal/types2/stmt.go
src/go/types/stmt.go
src/internal/types/testdata/spec/range_int.go [new file with mode: 0644]

index 0797da19d48d20dda5de05a35cc003789b305faa..fc13e9890fd7f810a0732555d69305218e8b1022 100644 (file)
@@ -994,7 +994,7 @@ func rangeKeyVal(typ Type) (key, val Type, cause string, isFunc, ok bool) {
                if isString(typ) {
                        return Typ[Int], universeRune, "", false, true // use 'rune' name
                }
-               if buildcfg.Experiment.Range && isInteger(typ) {
+               if isInteger(typ) {
                        return orig, nil, "", false, true
                }
        case *Array:
index 203205e19fe2b1c541eb40f64f0338df47240f1d..5363bb9870da3871c4fded368191c9443c2abedd 100644 (file)
@@ -979,7 +979,7 @@ func rangeKeyVal(typ Type) (key, val Type, cause string, isFunc, ok bool) {
                if isString(typ) {
                        return Typ[Int], universeRune, "", false, true // use 'rune' name
                }
-               if buildcfg.Experiment.Range && isInteger(typ) {
+               if isInteger(typ) {
                        return orig, nil, "", false, true
                }
        case *Array:
diff --git a/src/internal/types/testdata/spec/range_int.go b/src/internal/types/testdata/spec/range_int.go
new file mode 100644 (file)
index 0000000..178f01b
--- /dev/null
@@ -0,0 +1,65 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This is a subset of the tests in range.go for range over integers,
+// with extra tests, and without the need for -goexperiment=range.
+
+package p
+
+type MyInt int32
+
+func _() {
+       for range -1 {
+       }
+       for range 0 {
+       }
+       for range 1 {
+       }
+       for range uint8(1) {
+       }
+       for range int64(1) {
+       }
+       for range MyInt(1) {
+       }
+       for range 'x' {
+       }
+       for range 1.0 /* ERROR "cannot range over 1.0 (untyped float constant 1)" */ {
+       }
+
+       var i int
+       var mi MyInt
+       for i := range 10 {
+               _ = i
+       }
+       for i = range 10 {
+               _ = i
+       }
+       for i, j /* ERROR "range over 10 (untyped int constant) permits only one iteration variable" */ := range 10 {
+               _, _ = i, j
+       }
+       for i /* ERROR "cannot use i (value of type MyInt) as int value in assignment" */ = range MyInt(10) {
+               _ = i
+       }
+       for mi := range MyInt(10) {
+               _ = mi
+       }
+       for mi = range MyInt(10) {
+               _ = mi
+       }
+}
+
+func _[T int | string](x T) {
+       for range x /* ERROR "cannot range over x (variable of type T constrained by int | string): no core type" */ {
+       }
+}
+
+func _[T int | int64](x T) {
+       for range x /* ERROR "cannot range over x (variable of type T constrained by int | int64): no core type" */ {
+       }
+}
+
+func _[T ~int](x T) {
+       for range x { // ok
+       }
+}