From 58d177c63e9e9e50df4341d9aa5518c87a3309d8 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Tue, 23 Jun 2015 06:23:04 +1000 Subject: [PATCH] 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 --- src/cmd/asm/internal/asm/parse.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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() -- 2.50.0