Commit 58d177c6 authored by Rob Pike's avatar Rob Pike

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/11325Reviewed-by: default avatarAndrew Gerrand <adg@golang.org>
parent 98c9e9e7
...@@ -807,16 +807,17 @@ func (p *Parser) term() uint64 { ...@@ -807,16 +807,17 @@ func (p *Parser) term() uint64 {
case lex.LSH: case lex.LSH:
p.next() p.next()
shift := p.factor() 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 return value << shift
case lex.RSH: case lex.RSH:
p.next() p.next()
shift := p.term() shift := p.term()
// shift is a uint, so can never be negative. if int64(shift) < 0 {
if value&(1<<63) != 0 {
p.errorf("right shift with high bit set") p.errorf("right shift with high bit set")
} }
value >>= uint(shift) value >>= shift
case '&': case '&':
p.next() p.next()
value &= p.factor() value &= p.factor()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment