diff --git a/src/parser.c b/src/parser.c index b6574e52c8..da19d8b9bf 100644 --- a/src/parser.c +++ b/src/parser.c @@ -376,6 +376,7 @@ static block constant_fold(block a, block b, int op) { case '-': res = jv_number(na - nb); break; case '*': res = jv_number(na * nb); break; case '/': res = jv_number(na / nb); break; + case '%': res = jv_number((intmax_t)nb == 0 ? INFINITY : (intmax_t)na % (intmax_t)nb); break; case EQ: res = (cmp == 0 ? jv_true() : jv_false()); break; case NEQ: res = (cmp != 0 ? jv_true() : jv_false()); break; case '<': res = (cmp < 0 ? jv_true() : jv_false()); break; diff --git a/src/parser.y b/src/parser.y index e223adab53..bc360f3d8f 100644 --- a/src/parser.y +++ b/src/parser.y @@ -229,6 +229,7 @@ static block constant_fold(block a, block b, int op) { case '-': res = jv_number(na - nb); break; case '*': res = jv_number(na * nb); break; case '/': res = jv_number(na / nb); break; + case '%': res = jv_number((intmax_t)nb == 0 ? INFINITY : (intmax_t)na % (intmax_t)nb); break; case EQ: res = (cmp == 0 ? jv_true() : jv_false()); break; case NEQ: res = (cmp != 0 ? jv_true() : jv_false()); break; case '<': res = (cmp < 0 ? jv_true() : jv_false()); break; diff --git a/tests/jq.test b/tests/jq.test index 2d5c36b887..6127b6c120 100644 --- a/tests/jq.test +++ b/tests/jq.test @@ -1564,6 +1564,10 @@ try (1%.) catch . 1/0 jq: error: Division by zero? at , line 1: +%%FAIL +1%0 +jq: error: Remainder by zero? at , line 1: + # Basic numbers tests: integers, powers of two [range(-52;52;1)] as $powers | [$powers[]|pow(2;.)|log2] == $powers null