forked from aniani/vim
patch 8.2.2378: Vim9: no error message for dividing by zero
Problem: Vim9: no error message for dividing by zero. Solution: Give an error message. (issue #7704)
This commit is contained in:
parent
a28639e711
commit
99880f96cf
@ -343,3 +343,5 @@ EXTERN char e_mismatched_enddef[]
|
|||||||
INIT(= N_("E1152: Mismatched enddef"));
|
INIT(= N_("E1152: Mismatched enddef"));
|
||||||
EXTERN char e_invalid_operation_for_bool[]
|
EXTERN char e_invalid_operation_for_bool[]
|
||||||
INIT(= N_("E1153: Invalid operation for bool"));
|
INIT(= N_("E1153: Invalid operation for bool"));
|
||||||
|
EXTERN char e_divide_by_zero[]
|
||||||
|
INIT(= N_("E1154: Divide by zero"));
|
||||||
|
@ -63,8 +63,10 @@ num_divide(varnumber_T n1, varnumber_T n2)
|
|||||||
{
|
{
|
||||||
varnumber_T result;
|
varnumber_T result;
|
||||||
|
|
||||||
if (n2 == 0) // give an error message?
|
if (n2 == 0)
|
||||||
{
|
{
|
||||||
|
if (in_vim9script())
|
||||||
|
emsg(_(e_divide_by_zero));
|
||||||
if (n1 == 0)
|
if (n1 == 0)
|
||||||
result = VARNUM_MIN; // similar to NaN
|
result = VARNUM_MIN; // similar to NaN
|
||||||
else if (n1 < 0)
|
else if (n1 < 0)
|
||||||
@ -84,7 +86,8 @@ num_divide(varnumber_T n1, varnumber_T n2)
|
|||||||
varnumber_T
|
varnumber_T
|
||||||
num_modulus(varnumber_T n1, varnumber_T n2)
|
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);
|
return (n2 == 0) ? 0 : (n1 % n2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1376,7 +1376,6 @@ def Test_expr6()
|
|||||||
assert_equal(1, g:anint / 6)
|
assert_equal(1, g:anint / 6)
|
||||||
assert_equal(2, g:anint
|
assert_equal(2, g:anint
|
||||||
/ g:thefour)
|
/ g:thefour)
|
||||||
assert_true(1 / 0 > 99999)
|
|
||||||
|
|
||||||
assert_equal(5, 11 % 6)
|
assert_equal(5, 11 % 6)
|
||||||
assert_equal(4, g:anint % 6)
|
assert_equal(4, g:anint % 6)
|
||||||
@ -1384,7 +1383,6 @@ def Test_expr6()
|
|||||||
g:anint)
|
g:anint)
|
||||||
assert_equal(2, g:anint
|
assert_equal(2, g:anint
|
||||||
% g:thefour)
|
% g:thefour)
|
||||||
assert_equal(0, 1 % 0)
|
|
||||||
|
|
||||||
assert_equal(4, 6 * 4 / 6)
|
assert_equal(4, 6 * 4 / 6)
|
||||||
|
|
||||||
@ -1405,6 +1403,9 @@ def Test_expr6()
|
|||||||
|
|
||||||
CheckDefFailure(["var x = 6 * xxx"], 'E1001:', 1)
|
CheckDefFailure(["var x = 6 * xxx"], 'E1001:', 1)
|
||||||
CheckDefFailure(["var d = 6 * "], 'E1097:', 3)
|
CheckDefFailure(["var d = 6 * "], 'E1097:', 3)
|
||||||
|
|
||||||
|
CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1)
|
||||||
|
CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_expr6_vim9script()
|
def Test_expr6_vim9script()
|
||||||
|
@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2378,
|
||||||
/**/
|
/**/
|
||||||
2377,
|
2377,
|
||||||
/**/
|
/**/
|
||||||
|
@ -2954,10 +2954,16 @@ call_def_function(
|
|||||||
switch (iptr->isn_arg.op.op_type)
|
switch (iptr->isn_arg.op.op_type)
|
||||||
{
|
{
|
||||||
case EXPR_MULT: n1 = n1 * n2; break;
|
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_SUB: n1 = n1 - n2; break;
|
||||||
case EXPR_ADD: 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(tv1);
|
||||||
clear_tv(tv2);
|
clear_tv(tv2);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user