Skip to content

Commit d70840e

Browse files
committed
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.
1 parent 1b04ce2 commit d70840e

4 files changed

Lines changed: 23 additions & 5 deletions

File tree

src/errors.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ EXTERN char e_const_requires_a_value[]
7373
INIT(= N_("E1021: const requires a value"));
7474
EXTERN char e_type_or_initialization_required[]
7575
INIT(= N_("E1022: type or initialization required"));
76-
// E1023 unused
76+
EXTERN char e_using_number_as_bool_nr[]
77+
INIT(= N_("E1023: Using a Number as a Bool: %d"));
7778
EXTERN char e_using_number_as_string[]
7879
INIT(= N_("E1024: Using a Number as a String"));
7980
EXTERN char e_using_rcurly_outside_if_block_scope[]

src/testdir/test_vim9_func.vim

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,12 +1389,22 @@ def Test_search()
13891389
new
13901390
setline(1, ['foo', 'bar'])
13911391
let val = 0
1392+
# skip expr returns boolean
13921393
assert_equal(2, search('bar', 'W', 0, 0, {-> val == 1}))
1394+
:1
1395+
assert_equal(0, search('bar', 'W', 0, 0, {-> val == 0}))
1396+
# skip expr returns number, only 0 and 1 are accepted
1397+
:1
1398+
assert_equal(2, search('bar', 'W', 0, 0, {-> 0}))
1399+
:1
1400+
assert_equal(0, search('bar', 'W', 0, 0, {-> 1}))
1401+
assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1402+
assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
13931403
enddef
13941404

13951405
def Test_readdir()
1396-
eval expand('.')->readdir({e -> e[0] !=# '.'})
1397-
eval expand('.')->readdirex({e -> e.name[0] !=# '.'})
1406+
eval expand('sautest')->readdir({e -> e[0] !=# '.'})
1407+
eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'})
13981408
enddef
13991409

14001410
def Test_setbufvar()

src/typval.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@ tv_get_bool_or_number_chk(typval_T *varp, int *denote, int want_bool)
177177
switch (varp->v_type)
178178
{
179179
case VAR_NUMBER:
180+
if (want_bool && varp->vval.v_number != 0
181+
&& varp->vval.v_number != 1)
182+
{
183+
semsg(_(e_using_number_as_bool_nr), varp->vval.v_number);
184+
break;
185+
}
180186
return varp->vval.v_number;
181187
case VAR_FLOAT:
182188
#ifdef FEAT_FLOAT
@@ -261,13 +267,12 @@ tv_get_number_chk(typval_T *varp, int *denote)
261267

262268
/*
263269
* Get the boolean value of "varp". This is like tv_get_number_chk(),
264-
* but in Vim9 script accepts Number and Bool.
270+
* but in Vim9 script accepts Number (0 and 1) and Bool/Special.
265271
*/
266272
varnumber_T
267273
tv_get_bool(typval_T *varp)
268274
{
269275
return tv_get_bool_or_number_chk(varp, NULL, TRUE);
270-
271276
}
272277

273278
/*

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ static char *(features[]) =
754754

755755
static int included_patches[] =
756756
{ /* Add new patch number below this line */
757+
/**/
758+
1506,
757759
/**/
758760
1505,
759761
/**/

0 commit comments

Comments
 (0)