1
0
mirror of https://github.com/golang/go synced 2024-11-21 17:24:42 -07:00

go spec: handle a corner case of a special case for shifts...

- Added some additional examples.
- 6g appears to implement this semantics already.

Fixes #658.

R=rsc, r, iant, ken
CC=golang-dev
https://golang.org/cl/4538119
This commit is contained in:
Robert Griesemer 2011-06-08 09:11:18 -07:00
parent a609a6bb63
commit 636c5fac2d

View File

@ -1,5 +1,5 @@
<!-- title The Go Programming Language Specification --> <!-- title The Go Programming Language Specification -->
<!-- subtitle Version of May 24, 2011 --> <!-- subtitle Version of June 7, 2011 -->
<!-- <!--
TODO TODO
@ -2720,7 +2720,9 @@ The right operand in a shift expression must have unsigned integer type
or be an untyped constant that can be converted to unsigned integer type. or be an untyped constant that can be converted to unsigned integer type.
If the left operand of a non-constant shift expression is an untyped constant, If the left operand of a non-constant shift expression is an untyped constant,
the type of the constant is what it would be if the shift expression were the type of the constant is what it would be if the shift expression were
replaced by its left operand alone. replaced by its left operand alone; the type is <code>int</code> if it cannot
be determined from the context (for instance, if the shift expression is an
operand in a comparison against an untyped constant).
</p> </p>
<pre> <pre>
@ -2729,6 +2731,9 @@ var i = 1&lt;&lt;s // 1 has type int
var j int32 = 1&lt;&lt;s // 1 has type int32; j == 0 var j int32 = 1&lt;&lt;s // 1 has type int32; j == 0
var k = uint64(1&lt;&lt;s) // 1 has type uint64; k == 1&lt;&lt;33 var k = uint64(1&lt;&lt;s) // 1 has type uint64; k == 1&lt;&lt;33
var m int = 1.0&lt;&lt;s // legal: 1.0 has type int var m int = 1.0&lt;&lt;s // legal: 1.0 has type int
var n = 1.0&lt;&lt;s != 0 // legal: 1.0 has type int; n == false if ints are 32bits in size
var o = 1&lt;&lt;s == 2&lt;&lt;s // legal: 1 and 2 have type int; o == true if ints are 32bits in size
var p = 1&lt;&lt;s == 1&lt;&lt;33 // illegal if ints are 32bits in size: 1 has type int, but 1&lt;&lt;33 overflows int
var u = 1.0&lt;&lt;s // illegal: 1.0 has type float64, cannot shift var u = 1.0&lt;&lt;s // illegal: 1.0 has type float64, cannot shift
var v float32 = 1&lt;&lt;s // illegal: 1 has type float32, cannot shift var v float32 = 1&lt;&lt;s // illegal: 1 has type float32, cannot shift
var w int64 = 1.0&lt;&lt;33 // legal: 1.0&lt;&lt;33 is a constant shift expression var w int64 = 1.0&lt;&lt;33 // legal: 1.0&lt;&lt;33 is a constant shift expression