go/types, types2: enable range over int w/o need for goexperiment

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>
This commit is contained in:
Robert Griesemer 2023-10-31 16:13:21 -07:00 committed by Gopher Robot
parent e5ef484691
commit 11677d983e
3 changed files with 67 additions and 2 deletions

View 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:

View 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:

View file

@ -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
}
}