summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-22 15:06:35 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-22 15:06:35 +0200
commitd70840ed68296c1144d743e6335003c81c558c24 (patch)
tree2fe663bae5737733924e71796559725f5be472ad
parent1b04ce2d400fda97410a961288c496bd8f445a9c (diff)
downloadvim-git-d70840ed68296c1144d743e6335003c81c558c24.tar.gz
patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as boolv8.2.1506
Problem: Vim9: no error when using a number other than 0 or 1 as bool. Solution: Check the number is 0 or 1.
-rw-r--r--src/errors.h3
-rw-r--r--src/testdir/test_vim9_func.vim14
-rw-r--r--src/typval.c9
-rw-r--r--src/version.c2
4 files changed, 23 insertions, 5 deletions
diff --git a/src/errors.h b/src/errors.h
index a49aa738d..ffcbdefa3 100644
--- a/src/errors.h
+++ b/src/errors.h
@@ -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[]
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 466110881..35a8bf765 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -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()
diff --git a/src/typval.c b/src/typval.c
index 2203bc6fa..d1732f2b7 100644
--- a/src/typval.c
+++ b/src/typval.c
@@ -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);
-
}
/*
diff --git a/src/version.c b/src/version.c
index 843fd43b6..575f343ea 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1506,
+/**/
1505,
/**/
1504,