diff options
author | Robert Griesemer <gri@golang.org> | 2024-04-23 17:22:02 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2024-04-26 00:39:16 +0000 |
commit | 5419f652b6593a0916f7b2155435b945e8ee0fb4 (patch) | |
tree | 6d4892e7a2eb5a46de73c418bbb9fde0379b7cc3 /doc | |
parent | 1ca31eac40c0400efc8211bc2483fd621264be11 (diff) | |
download | go-5419f652b6593a0916f7b2155435b945e8ee0fb4.tar.gz go-5419f652b6593a0916f7b2155435b945e8ee0fb4.zip |
spec: clarify prose for range over numeric range expressions
Fixes #66967.
Change-Id: I7b9d62dcb83bad60b2ce74e2e2bf1a36c6a8ae38
Reviewed-on: https://go-review.googlesource.com/c/go/+/581256
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Bypass: Robert Griesemer <gri@google.com>
Diffstat (limited to 'doc')
-rw-r--r-- | doc/go_spec.html | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/doc/go_spec.html b/doc/go_spec.html index f5069f62d6..ac27c1d6c1 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ <!--{ "Title": "The Go Programming Language Specification", - "Subtitle": "Language version go1.22 (April 24, 2024)", + "Subtitle": "Language version go1.22 (April 25, 2024)", "Path": "/ref/spec" }--> @@ -6656,13 +6656,13 @@ if the respective iteration variables are present: </p> <pre class="grammar"> -Range expression 1st value 2nd value +Range expression 1st value 2nd value -array or slice a [n]E, *[n]E, or []E index i int a[i] E -string s string type index i int see below rune -map m map[K]V key k K m[k] V -channel c chan E, <-chan E element e E -integer n integer type value i see below +array or slice a [n]E, *[n]E, or []E index i int a[i] E +string s string type index i int see below rune +map m map[K]V key k K m[k] V +channel c chan E, <-chan E element e E +integer value n integer type, or untyped int value i see below </pre> <ol> @@ -6703,8 +6703,17 @@ is <code>nil</code>, the range expression blocks forever. </li> <li> -For an integer value <code>n</code>, the iteration values 0 through <code>n-1</code> +For an integer value <code>n</code>, where <code>n</code> is of <a href="#Numeric_types">integer type</a> +or an untyped <a href="#Constants">integer constant</a>, the iteration values 0 through <code>n-1</code> are produced in increasing order. +If <code>n</code> is of integer type, the iteration values have that same type. +Otherwise, the type of <code>n</code> is determined as if it were assigned to the +iteration variable. +Specifically: +if the iteration variable is preexisting, the type of the iteration values is the type of the iteration +variable, which must be of integer type. +Otherwise, if the iteration variable is declared by the "range" clause or is absent, +the type of the iteration values is the <a href="#Constants">default type</a> for <code>n</code>. If <code>n</code> <= 0, the loop does not run any iterations. </li> </ol> @@ -6716,11 +6725,7 @@ The iteration variables may be declared by the "range" clause using a form of In this case their <a href="#Declarations_and_scope">scope</a> is the block of the "for" statement and each iteration has its own new variables [<a href="#Go_1.22">Go 1.22</a>] (see also <a href="#For_clause">"for" statements with a ForClause</a>). -If the range expression is a (possibly untyped) integer expression <code>n</code>, -the variable has the same type as if it was -<a href="#Variable_declarations">declared</a> with initialization -expression <code>n</code>. -Otherwise, the variables have the types of their respective iteration values. +The variables have the types of their respective iteration values. </p> <p> @@ -6728,9 +6733,6 @@ If the iteration variables are not explicitly declared by the "range" clause, they must be preexisting. In this case, the iteration values are assigned to the respective variables as in an <a href="#Assignment_statements">assignment statement</a>. -If the range expression is a (possibly untyped) integer expression <code>n</code>, -<code>n</code> too must be <a href="#Assignability">assignable</a> to the iteration variable; -if there is no iteration variable, <code>n</code> must be assignable to <code>int</code>. </p> <pre> @@ -6778,6 +6780,10 @@ for i := range 10 { var u uint8 for u = range 256 { } + +// invalid: 1e3 is a floating-point constant +for range 1e3 { +} </pre> |