diff --git a/jerry-core/vm/opcodes-ecma-bitwise.c b/jerry-core/vm/opcodes-ecma-bitwise.c index de692345c..3653f7b14 100644 --- a/jerry-core/vm/opcodes-ecma-bitwise.c +++ b/jerry-core/vm/opcodes-ecma-bitwise.c @@ -93,7 +93,7 @@ do_number_bitwise_logic (number_bitwise_logic_op op, /**< number bitwise logic o } case NUMBER_BITWISE_SHIFT_LEFT: { - result = (ecma_number_t) (ecma_number_to_int32 (left_number) << (right_uint32 & 0x1F)); + result = (ecma_number_t) ((int32_t) ((uint32_t) ecma_number_to_int32 (left_number) << (right_uint32 & 0x1F))); break; } case NUMBER_BITWISE_SHIFT_RIGHT: diff --git a/tests/jerry/shift.js b/tests/jerry/shift.js index 74f5cd884..f1584d23c 100644 --- a/tests/jerry/shift.js +++ b/tests/jerry/shift.js @@ -31,3 +31,14 @@ assert((9 >> 2) === 2); assert((-14 >> 2) === -4); assert((9 >>> 2) === (9 >> 2)); + +assert(("-1.234" << 0) == -1); +assert(("-1.234" << -1) == -2147483648); +assert((-1.2 << 0) === -1); +assert((-1.1 << -1) === -2147483648); +assert((-1.1 << -1.1) === -2147483648); +assert((-1.1 << -999) === -33554432); +assert((-1.1 << 999) === -128); +assert((-33554431.0 << 0) === -33554431); +assert((-33554431.0 << -1.1) === -2147483648); +assert((-33554431.0 << -999) === 33554432);