]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: add missing test for constant shifts
authorRobert Griesemer <gri@golang.org>
Mon, 22 Jun 2015 23:01:17 +0000 (16:01 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 23 Jun 2015 18:03:49 +0000 (18:03 +0000)
Port of https://go-review.googlesource.com/11344 to std repo.

Fixes #11325.

Change-Id: I634beaf77cbaeb09de50aa1410e8c53fc37b19df
Reviewed-on: https://go-review.googlesource.com/11317
Reviewed-by: Alan Donovan <adonovan@google.com>
src/go/types/expr.go
src/go/types/testdata/shifts.src

index 425ae91bb49a123330db4fe1737a6424466f5338..e9baf93aeb687685d90842eeebb4814ec6cb8cb4 100644 (file)
@@ -619,7 +619,7 @@ func (check *Checker) shift(x, y *operand, op token.Token) {
 
        // The lhs must be of integer type or be representable
        // as an integer; otherwise the shift has no chance.
-       if !isInteger(x.typ) && (!untypedx || !representableConst(x.val, nil, UntypedInt, nil)) {
+       if !x.isInteger() {
                check.invalidOp(x.pos(), "shifted operand %s must be integer", x)
                x.mode = invalid
                return
@@ -645,6 +645,12 @@ func (check *Checker) shift(x, y *operand, op token.Token) {
 
        if x.mode == constant {
                if y.mode == constant {
+                       // rhs must be an integer value
+                       if !y.isInteger() {
+                               check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y)
+                               x.mode = invalid
+                               return
+                       }
                        // rhs must be within reasonable bounds
                        const stupidShift = 1023 - 1 + 52 // so we can express smallestFloat64
                        s, ok := exact.Uint64Val(y.val)
index 7f8ed06fbfabc0a62a4c68bdaf544bc1b66194a6..2df2ccde0b7659e58f736a05eca05887125059bb 100644 (file)
@@ -319,3 +319,15 @@ func issue5895() {
        var x = 'a' << 1 // type of x must be rune
        var _ rune = x
 }
+
+func issue11325() {
+       var _ = 0 >> 1.1 /* ERROR "must be unsigned integer" */ // example from issue 11325
+       _ = 0 >> 1.1 /* ERROR "must be unsigned integer" */
+       _ = 0 << 1.1 /* ERROR "must be unsigned integer" */
+       _ = 0 >> 1.
+       _ = 1 >> 1.1 /* ERROR "must be unsigned integer" */
+       _ = 1 >> 1.
+       _ = 1. >> 1
+       _ = 1. >> 1.
+       _ = 1.1 /* ERROR "must be integer" */ >> 1
+}