mirror of https://github.com/golang/go.git
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:
parent
e5ef484691
commit
11677d983e
|
|
@ -994,7 +994,7 @@ func rangeKeyVal(typ Type) (key, val Type, cause string, isFunc, ok bool) {
|
||||||
if isString(typ) {
|
if isString(typ) {
|
||||||
return Typ[Int], universeRune, "", false, true // use 'rune' name
|
return Typ[Int], universeRune, "", false, true // use 'rune' name
|
||||||
}
|
}
|
||||||
if buildcfg.Experiment.Range && isInteger(typ) {
|
if isInteger(typ) {
|
||||||
return orig, nil, "", false, true
|
return orig, nil, "", false, true
|
||||||
}
|
}
|
||||||
case *Array:
|
case *Array:
|
||||||
|
|
|
||||||
|
|
@ -979,7 +979,7 @@ func rangeKeyVal(typ Type) (key, val Type, cause string, isFunc, ok bool) {
|
||||||
if isString(typ) {
|
if isString(typ) {
|
||||||
return Typ[Int], universeRune, "", false, true // use 'rune' name
|
return Typ[Int], universeRune, "", false, true // use 'rune' name
|
||||||
}
|
}
|
||||||
if buildcfg.Experiment.Range && isInteger(typ) {
|
if isInteger(typ) {
|
||||||
return orig, nil, "", false, true
|
return orig, nil, "", false, true
|
||||||
}
|
}
|
||||||
case *Array:
|
case *Array:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue