From: Bram Moolenaar Date: Sat, 22 Aug 2020 13:06:35 +0000 (+0200) Subject: patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool X-Git-Tag: v8.2.1506 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d70840ed68296c1144d743e6335003c81c558c24;p=vim patch 8.2.1506: Vim9: no error when using a number other than 0 or 1 as bool Problem: Vim9: no error when using a number other than 0 or 1 as bool. Solution: Check the number is 0 or 1. --- 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 @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1506, /**/ 1505, /**/