From: Rob Pike Date: Mon, 22 Jun 2015 20:23:04 +0000 (+1000) Subject: cmd/asm: fix handling of negative shifts. X-Git-Tag: go1.5beta1~150 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=58d177c63e9e9e50df4341d9aa5518c87a3309d8;p=gostls13.git cmd/asm: fix handling of negative shifts. The change that "fixed" LSH was incorrect, and the fix for RSH was poor. Make both use a correct, simple test: if the 64-bit value as a signed integer is negative, it's an error. Really fixes #11278. Change-Id: I72cca03d7ad0d64fd649fa33a9ead2f31bd2977b Reviewed-on: https://go-review.googlesource.com/11325 Reviewed-by: Andrew Gerrand --- diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go index d7b5250913..18cc27fa83 100644 --- a/src/cmd/asm/internal/asm/parse.go +++ b/src/cmd/asm/internal/asm/parse.go @@ -807,16 +807,17 @@ func (p *Parser) term() uint64 { case lex.LSH: p.next() shift := p.factor() - // shift is a uint, so can never be negative. + if int64(shift) < 0 { + p.errorf("left shift with high bit set") + } return value << shift case lex.RSH: p.next() shift := p.term() - // shift is a uint, so can never be negative. - if value&(1<<63) != 0 { + if int64(shift) < 0 { p.errorf("right shift with high bit set") } - value >>= uint(shift) + value >>= shift case '&': p.next() value &= p.factor()