diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-01-20 21:23:14 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-01-20 21:23:14 +0100 |
commit | 99880f96cf444014d589fc1d99bb164deaba71ce (patch) | |
tree | c06cd75862453e8ea2409f69ecfc6a9191e3b7f3 | |
parent | a28639e71198238d5c09c43445dc448d7f3fb29b (diff) | |
download | vim-git-99880f96cf444014d589fc1d99bb164deaba71ce.tar.gz |
patch 8.2.2378: Vim9: no error message for dividing by zerov8.2.2378
Problem: Vim9: no error message for dividing by zero.
Solution: Give an error message. (issue #7704)
-rw-r--r-- | src/errors.h | 2 | ||||
-rw-r--r-- | src/eval.c | 7 | ||||
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 5 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 10 |
5 files changed, 20 insertions, 6 deletions
diff --git a/src/errors.h b/src/errors.h index eb5ee1de2..4bd4efea6 100644 --- a/src/errors.h +++ b/src/errors.h @@ -343,3 +343,5 @@ EXTERN char e_mismatched_enddef[] INIT(= N_("E1152: Mismatched enddef")); EXTERN char e_invalid_operation_for_bool[] INIT(= N_("E1153: Invalid operation for bool")); +EXTERN char e_divide_by_zero[] + INIT(= N_("E1154: Divide by zero")); diff --git a/src/eval.c b/src/eval.c index 13ee49aac..40c6feb70 100644 --- a/src/eval.c +++ b/src/eval.c @@ -63,8 +63,10 @@ num_divide(varnumber_T n1, varnumber_T n2) { varnumber_T result; - if (n2 == 0) // give an error message? + if (n2 == 0) { + if (in_vim9script()) + emsg(_(e_divide_by_zero)); if (n1 == 0) result = VARNUM_MIN; // similar to NaN else if (n1 < 0) @@ -84,7 +86,8 @@ num_divide(varnumber_T n1, varnumber_T n2) varnumber_T num_modulus(varnumber_T n1, varnumber_T n2) { - // Give an error when n2 is 0? + if (n2 == 0 && in_vim9script()) + emsg(_(e_divide_by_zero)); return (n2 == 0) ? 0 : (n1 % n2); } diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index c81468cb3..2239e76df 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1376,7 +1376,6 @@ def Test_expr6() assert_equal(1, g:anint / 6) assert_equal(2, g:anint / g:thefour) - assert_true(1 / 0 > 99999) assert_equal(5, 11 % 6) assert_equal(4, g:anint % 6) @@ -1384,7 +1383,6 @@ def Test_expr6() g:anint) assert_equal(2, g:anint % g:thefour) - assert_equal(0, 1 % 0) assert_equal(4, 6 * 4 / 6) @@ -1405,6 +1403,9 @@ def Test_expr6() CheckDefFailure(["var x = 6 * xxx"], 'E1001:', 1) CheckDefFailure(["var d = 6 * "], 'E1097:', 3) + + CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1) + CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1) enddef def Test_expr6_vim9script() diff --git a/src/version.c b/src/version.c index 57b1a0c47..5668f7554 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2378, +/**/ 2377, /**/ 2376, diff --git a/src/vim9execute.c b/src/vim9execute.c index 907a52f18..b1bc28263 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2954,10 +2954,16 @@ call_def_function( switch (iptr->isn_arg.op.op_type) { case EXPR_MULT: n1 = n1 * n2; break; - case EXPR_DIV: n1 = num_divide(n1, n2); break; + case EXPR_DIV: n1 = num_divide(n1, n2); + if (n2 == 0) + goto on_error; + break; case EXPR_SUB: n1 = n1 - n2; break; case EXPR_ADD: n1 = n1 + n2; break; - default: n1 = num_modulus(n1, n2); break; + default: n1 = num_modulus(n1, n2); + if (n2 == 0) + goto on_error; + break; } clear_tv(tv1); clear_tv(tv2); |