From 58e21ddaf9498462acb5c552c48e0c52073e1db3 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Fri, 15 Mar 2013 13:55:50 -0700 Subject: [PATCH] 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 --- doc/go_spec.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/go_spec.html b/doc/go_spec.html index bf96322517..eb412f32d7 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -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 int 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.

@@ -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
 
-- 2.50.0