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:
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:
--- /dev/null
+// 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
+ }
+}