go/types: add missing test for constant shifts
Fixes golang/go#11325. Change-Id: Ic302098fffd337fcfa31274319cdbd78907a6d5d Reviewed-on: https://go-review.googlesource.com/11344 Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
parent
af817890aa
commit
e9a746de6e
|
@ -620,7 +620,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
|
||||
|
@ -646,6 +646,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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue