1
0
mirror of https://github.com/golang/go synced 2024-10-05 05:11:25 -06:00

go/types: fix internal inInteger operand predicate

When testing if a value is an integer, if the value is a constant,
don't ignore the type if it has one.

Fixes #11594.

Change-Id: I2ff387e4f9e8ab7cae35c4838350e0a1fce2e625
Reviewed-on: https://go-review.googlesource.com/12045
Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Robert Griesemer 2015-07-10 16:11:06 -06:00 committed by Alan Donovan
parent 8b6527b70e
commit e7a10a9614
3 changed files with 12 additions and 2 deletions

View File

@ -278,9 +278,10 @@ func (x *operand) assignableTo(conf *Config, T Type) bool {
return false
}
// isInteger reports whether x is a (typed or untyped) integer value.
// isInteger reports whether x is value of integer type
// or an untyped constant representable as an integer.
func (x *operand) isInteger() bool {
return x.mode == invalid ||
isInteger(x.typ) ||
x.mode == constant && representableConst(x.val, nil, UntypedInt, nil) // no *Config required for UntypedInt
isUntyped(x.typ) && x.mode == constant && representableConst(x.val, nil, UntypedInt, nil) // no *Config required for UntypedInt
}

View File

@ -53,6 +53,7 @@ type (
iA1 [1 /* ERROR "invalid array length" */ <<100]int
iA2 [- /* ERROR "invalid array length" */ 1]complex128
iA3 ["foo" /* ERROR "must be integer" */ ]string
iA4 [float64 /* ERROR "must be integer" */ (0)]int
)

View File

@ -331,3 +331,11 @@ func issue11325() {
_ = 1. >> 1.
_ = 1.1 /* ERROR "must be integer" */ >> 1
}
func issue11594() {
var _ = complex64 /* ERROR "must be integer" */ (1) << 2 // example from issue 11594
_ = float32 /* ERROR "must be integer" */ (0) << 1
_ = float64 /* ERROR "must be integer" */ (0) >> 2
_ = complex64 /* ERROR "must be integer" */ (0) << 3
_ = complex64 /* ERROR "must be integer" */ (0) >> 4
}