mirror of
https://github.com/golang/go
synced 2024-11-21 23:14:40 -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:
parent
a609a6bb63
commit
636c5fac2d
@ -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<<s // 1 has type int
|
|||||||
var j int32 = 1<<s // 1 has type int32; j == 0
|
var j int32 = 1<<s // 1 has type int32; j == 0
|
||||||
var k = uint64(1<<s) // 1 has type uint64; k == 1<<33
|
var k = uint64(1<<s) // 1 has type uint64; k == 1<<33
|
||||||
var m int = 1.0<<s // legal: 1.0 has type int
|
var m int = 1.0<<s // legal: 1.0 has type int
|
||||||
|
var n = 1.0<<s != 0 // legal: 1.0 has type int; n == false if ints are 32bits in size
|
||||||
|
var o = 1<<s == 2<<s // legal: 1 and 2 have type int; o == true if ints are 32bits in size
|
||||||
|
var p = 1<<s == 1<<33 // illegal if ints are 32bits in size: 1 has type int, but 1<<33 overflows int
|
||||||
var u = 1.0<<s // illegal: 1.0 has type float64, cannot shift
|
var u = 1.0<<s // illegal: 1.0 has type float64, cannot shift
|
||||||
var v float32 = 1<<s // illegal: 1 has type float32, cannot shift
|
var v float32 = 1<<s // illegal: 1 has type float32, cannot shift
|
||||||
var w int64 = 1.0<<33 // legal: 1.0<<33 is a constant shift expression
|
var w int64 = 1.0<<33 // legal: 1.0<<33 is a constant shift expression
|
||||||
|
Loading…
Reference in New Issue
Block a user