Commit 5f74721e authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #1348 from carsonmcdonald/shiftwarningfix

Fix signed/unsigned warning in numeric shift
parents bccf1259 9a5e78ae
...@@ -998,7 +998,7 @@ fix_xor(mrb_state *mrb, mrb_value x) ...@@ -998,7 +998,7 @@ fix_xor(mrb_state *mrb, mrb_value x)
#define NUMERIC_SHIFT_WIDTH_MAX (sizeof(mrb_int)*CHAR_BIT-1) #define NUMERIC_SHIFT_WIDTH_MAX (sizeof(mrb_int)*CHAR_BIT-1)
static mrb_value static mrb_value
lshift(mrb_state *mrb, mrb_int val, int width) lshift(mrb_state *mrb, mrb_int val, size_t width)
{ {
if (width > NUMERIC_SHIFT_WIDTH_MAX) { if (width > NUMERIC_SHIFT_WIDTH_MAX) {
mrb_raisef(mrb, E_RANGE_ERROR, "width(%S) > (%S:sizeof(mrb_int)*CHAR_BIT-1)", mrb_raisef(mrb, E_RANGE_ERROR, "width(%S) > (%S:sizeof(mrb_int)*CHAR_BIT-1)",
...@@ -1010,7 +1010,7 @@ lshift(mrb_state *mrb, mrb_int val, int width) ...@@ -1010,7 +1010,7 @@ lshift(mrb_state *mrb, mrb_int val, int width)
} }
static mrb_value static mrb_value
rshift(mrb_int val, int width) rshift(mrb_int val, size_t width)
{ {
if (width >= NUMERIC_SHIFT_WIDTH_MAX) { if (width >= NUMERIC_SHIFT_WIDTH_MAX) {
if (val < 0) { if (val < 0) {
......
...@@ -104,6 +104,14 @@ assert('Integer#<<', '15.2.8.3.12') do ...@@ -104,6 +104,14 @@ assert('Integer#<<', '15.2.8.3.12') do
# 00010111 (23) # 00010111 (23)
# = 00101110 (46) # = 00101110 (46)
assert_equal 23 << 1, 46 assert_equal 23 << 1, 46
# Left Shift by a negative is Right Shift
assert_equal 46 << -1, 23
# Raise when shift is too large
assert_raise(RangeError) do
2 << 128
end
end end
assert('Integer#>>', '15.2.8.3.13') do assert('Integer#>>', '15.2.8.3.13') do
...@@ -111,6 +119,17 @@ assert('Integer#>>', '15.2.8.3.13') do ...@@ -111,6 +119,17 @@ assert('Integer#>>', '15.2.8.3.13') do
# 00101110 (46) # 00101110 (46)
# = 00010111 (23) # = 00010111 (23)
assert_equal 46 >> 1, 23 assert_equal 46 >> 1, 23
# Right Shift by a negative is Left Shift
assert_equal 23 >> -1, 46
# Don't raise on large Right Shift
assert_equal 23 >> 128, 0
# Raise when shift is too large
assert_raise(RangeError) do
2 >> -128
end
end end
assert('Integer#ceil', '15.2.8.3.14') do assert('Integer#ceil', '15.2.8.3.14') do
......
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