]> granicus.if.org Git - vim/commitdiff
patch 8.2.2378: Vim9: no error message for dividing by zero v8.2.2378
authorBram Moolenaar <Bram@vim.org>
Wed, 20 Jan 2021 20:23:14 +0000 (21:23 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 20 Jan 2021 20:23:14 +0000 (21:23 +0100)
Problem:    Vim9: no error message for dividing by zero.
Solution:   Give an error message. (issue #7704)

src/errors.h
src/eval.c
src/testdir/test_vim9_expr.vim
src/version.c
src/vim9execute.c

index eb5ee1de2e9db799546eb323c3ced16f9d8e78e2..4bd4efea697412883fc34a32dd140d45373de4c5 100644 (file)
@@ -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"));
index 13ee49aac4f4a28dec6d21898eb585eed174b984..40c6feb70645fc7eaa8bbfdea9c81992cd16cee3 100644 (file)
@@ -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);
 }
 
index c81468cb36eb17cfead7c5a6b593557746729c37..2239e76df9a1c617cecdb7a8c2f27f1c8c430477 100644 (file)
@@ -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()
index 57b1a0c47414f1645282f65456eb8ee640385e41..5668f75546db07a5f5ce9081682fca74e0c2d5e8 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2378,
 /**/
     2377,
 /**/
index 907a52f18f2ba2bad302eb6b6be2c50f03c31f65..b1bc2826364343b128dc888bf6210397180a9b8a 100644 (file)
@@ -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);