diff --git a/src/optimizer/foldBinary.go b/src/optimizer/foldBinary.go index 1e91e8d..b2ef849 100644 --- a/src/optimizer/foldBinary.go +++ b/src/optimizer/foldBinary.go @@ -18,9 +18,9 @@ func foldBinary(op token.Kind, a int, b int) int { case token.Or, token.LogicalOr: return a | b case token.Shl: - return a << b + return a << (b & 63) case token.Shr: - return a >> b + return a >> (b & 63) case token.Sub: return a - b case token.Xor: diff --git a/tests/shift-range.q b/tests/shift-range.q new file mode 100644 index 0000000..f39eda9 --- /dev/null +++ b/tests/shift-range.q @@ -0,0 +1,9 @@ +main() { + assert 1 << 65 == 2 + assert 1 << 592 == 1 << 16 + assert 1 << -1 == (-(9223372036854775807) - 1) + assert 1 >> -7 == 0 + assert 76 >> 592 == 0 + assert 76 >> 64 == 76 + assert 123 >> 64 == 123 +} \ No newline at end of file diff --git a/tests/tests_test.go b/tests/tests_test.go index 6b13913..bc6dee5 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -32,6 +32,7 @@ var tests = []run{ {"shift", nil, "", "", 0}, {"shift-register", nil, "", "", 0}, {"shift-sign", nil, "", "", 0}, + {"shift-range", nil, "", "", 0}, {"modulo", nil, "", "", 0}, {"signed", nil, "", "", 0}, {"negation", nil, "", "", 0},