diff --git a/prism/util/pm_integer.c b/prism/util/pm_integer.c index ff683d3501..e39108a05b 100644 --- a/prism/util/pm_integer.c +++ b/prism/util/pm_integer.c @@ -159,16 +159,19 @@ pm_integer_memsize(const pm_integer_t *integer) { */ int pm_integer_compare(const pm_integer_t *left, const pm_integer_t *right) { - if (left->length < right->length) return -1; - if (left->length > right->length) return 1; + if (left->negative != right->negative) return left->negative ? -1 : 1; + int negative = left->negative ? -1 : 1; + + if (left->length < right->length) return -1 * negative; + if (left->length > right->length) return 1 * negative; for ( const pm_integer_word_t *left_word = &left->head, *right_word = &right->head; left_word != NULL && right_word != NULL; left_word = left_word->next, right_word = right_word->next ) { - if (left_word->value < right_word->value) return -1; - if (left_word->value > right_word->value) return 1; + if (left_word->value < right_word->value) return -1 * negative; + if (left_word->value > right_word->value) return 1 * negative; } return 0; diff --git a/test/prism/static_literals_test.rb b/test/prism/static_literals_test.rb index b28f1f9187..6108e2ddbc 100644 --- a/test/prism/static_literals_test.rb +++ b/test/prism/static_literals_test.rb @@ -13,6 +13,10 @@ module Prism assert_warning((2**32).to_s(10), "0x#{(2**32).to_s(16)}") assert_warning((2**64).to_s(10), "0x#{(2**64).to_s(16)}") + refute_warning("1", "-1") + refute_warning((2**32).to_s(10), "-0x#{(2**32).to_s(16)}") + refute_warning((2**64).to_s(10), "-0x#{(2**64).to_s(16)}") + assert_warning("__LINE__", "2") assert_warning("3", "__LINE__") @@ -33,6 +37,7 @@ module Prism assert_warning("\"#{__FILE__}\"", "__FILE__") assert_warning("/foo/") + refute_warning("/foo/", "/foo/i") assert_warning(":foo")