mirror of
https://github.com/golang/go
synced 2024-11-12 02:50:25 -07:00
spec: remove special int rule for shifts
The rule is not concistently followed by gc. It appears that gccgo is ignoring it. go/types does not implement this rule. However, both gccgo and now go/types can compile/type-check the entire std library (and thus all the shift expressions occuring in it) w/o errors. For more details see the discussion in issue 4883. Fixes #4880. Fixes #4881. Fixes #4883. R=rsc, r, iant, ken, ken, mtj, rogpeppe CC=golang-dev https://golang.org/cl/7707043
This commit is contained in:
parent
7b7619626a
commit
58e21ddaf9
@ -1,6 +1,6 @@
|
||||
<!--{
|
||||
"Title": "The Go Programming Language Specification",
|
||||
"Subtitle": "Version of March 12, 2013",
|
||||
"Subtitle": "Version of March 15, 2013",
|
||||
"Path": "/ref/spec"
|
||||
}-->
|
||||
|
||||
@ -2905,9 +2905,7 @@ 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.
|
||||
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
|
||||
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).
|
||||
replaced by its left operand alone.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
@ -2916,10 +2914,12 @@ var i = 1<<s // 1 has type int
|
||||
var j int32 = 1<<s // 1 has type int32; j == 0
|
||||
var k = uint64(1<<s) // 1 has type uint64; k == 1<<33
|
||||
var m int = 1.0<<s // 1.0 has type int
|
||||
var n = 1.0<<s != 0 // 1.0 has type int; n == false if ints are 32bits in size
|
||||
var n = 1.0<<s != i // 1.0 has type int; n == false if ints are 32bits in size
|
||||
var o = 1<<s == 2<<s // 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 u1 = 1.0<<s != 0 // illegal: 1.0 has type float64, cannot shift
|
||||
var u2 = 1<<s != 1.0 // illegal: 1 has type float64, cannot shift
|
||||
var v float32 = 1<<s // illegal: 1 has type float32, cannot shift
|
||||
var w int64 = 1.0<<33 // 1.0<<33 is a constant shift expression
|
||||
</pre>
|
||||
|
Loading…
Reference in New Issue
Block a user