]> granicus.if.org Git - vim/commitdiff
patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool v8.2.1506
authorBram Moolenaar <Bram@vim.org>
Sat, 22 Aug 2020 13:06:35 +0000 (15:06 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 22 Aug 2020 13:06:35 +0000 (15:06 +0200)
Problem:    Vim9: no error when using a number other than 0 or 1 as bool.
Solution:   Check the number is 0 or 1.

src/errors.h
src/testdir/test_vim9_func.vim
src/typval.c
src/version.c

index a49aa738d16b91aa928c6fc806b287942fa9eb29..ffcbdefa3aec382665c7c947b05814ab8f9e1ee2 100644 (file)
@@ -73,7 +73,8 @@ EXTERN char e_const_requires_a_value[]
        INIT(= N_("E1021: const requires a value"));
 EXTERN char e_type_or_initialization_required[]
        INIT(= N_("E1022: type or initialization required"));
-// E1023 unused
+EXTERN char e_using_number_as_bool_nr[]
+       INIT(= N_("E1023: Using a Number as a Bool: %d"));
 EXTERN char e_using_number_as_string[]
        INIT(= N_("E1024: Using a Number as a String"));
 EXTERN char e_using_rcurly_outside_if_block_scope[]
index 466110881577578ce207560996686ea5a8fdcb6d..35a8bf765b12cffb7b6fd2977adb30cd431bf2b2 100644 (file)
@@ -1389,12 +1389,22 @@ def Test_search()
   new
   setline(1, ['foo', 'bar'])
   let val = 0
+  # skip expr returns boolean
   assert_equal(2, search('bar', 'W', 0, 0, {-> val == 1}))
+  :1
+  assert_equal(0, search('bar', 'W', 0, 0, {-> val == 0}))
+  # skip expr returns number, only 0 and 1 are accepted
+  :1
+  assert_equal(2, search('bar', 'W', 0, 0, {-> 0}))
+  :1
+  assert_equal(0, search('bar', 'W', 0, 0, {-> 1}))
+  assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
+  assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
 enddef
 
 def Test_readdir()
-   eval expand('.')->readdir({e -> e[0] !=# '.'})
-   eval expand('.')->readdirex({e -> e.name[0] !=# '.'})
+   eval expand('sautest')->readdir({e -> e[0] !=# '.'})
+   eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'})
 enddef
 
 def Test_setbufvar()
index 2203bc6fac36ec515801400f63c7d89542591655..d1732f2b7c0ca26f16783a01d1203223788b356c 100644 (file)
@@ -177,6 +177,12 @@ tv_get_bool_or_number_chk(typval_T *varp, int *denote, int want_bool)
     switch (varp->v_type)
     {
        case VAR_NUMBER:
+           if (want_bool && varp->vval.v_number != 0
+                                                  && varp->vval.v_number != 1)
+           {
+               semsg(_(e_using_number_as_bool_nr), varp->vval.v_number);
+               break;
+           }
            return varp->vval.v_number;
        case VAR_FLOAT:
 #ifdef FEAT_FLOAT
@@ -261,13 +267,12 @@ tv_get_number_chk(typval_T *varp, int *denote)
 
 /*
  * Get the boolean value of "varp".  This is like tv_get_number_chk(),
- * but in Vim9 script accepts Number and Bool.
+ * but in Vim9 script accepts Number (0 and 1) and Bool/Special.
  */
     varnumber_T
 tv_get_bool(typval_T *varp)
 {
     return tv_get_bool_or_number_chk(varp, NULL, TRUE);
-
 }
 
 /*
index 843fd43b64703b6cc98d74d91aa54f3dfce615d2..575f343eae91f39e83817a61f8824fc539289749 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1506,
 /**/
     1505,
 /**/