changeset 23673:6d35bc0f161e v8.2.2378

patch 8.2.2378: Vim9: no error message for dividing by zero Commit: https://github.com/vim/vim/commit/99880f96cf444014d589fc1d99bb164deaba71ce Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jan 20 21:23:14 2021 +0100 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 https://github.com/vim/vim/issues/7704)
author Bram Moolenaar <Bram@vim.org>
date Wed, 20 Jan 2021 21:30:04 +0100
parents 226d94848204
children f1c73c482aac
files src/errors.h src/eval.c src/testdir/test_vim9_expr.vim src/version.c src/vim9execute.c
diffstat 5 files changed, 20 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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"));
--- a/src/eval.c
+++ b/src/eval.c
@@ -63,8 +63,10 @@ num_divide(varnumber_T n1, varnumber_T n
 {
     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 n
 	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);
 }
 
--- 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()
--- 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,
--- 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);