patch 8.2.1668: Vim9: not accepting 0 or 1 as bool when type is any
Problem: Vim9: not accepting 0 or 1 as bool when type is any.
Solution: Convert the type with the CHECKTYPE instruction. (closes #6913)
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 8cf5bc0..15fc3ae 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -2369,6 +2369,9 @@
type: '',
module: ''}
], getloclist(0))
+
+ let result: bool = get(#{n: 0}, 'n', 0)
+ assert_equal(false, result)
enddef
func Test_expr7_trailing_fails()
diff --git a/src/version.c b/src/version.c
index b225f74..305f0cb 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1668,
+/**/
1667,
/**/
1666,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 18cfb02..e93817a 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -2510,11 +2510,23 @@
|| (tv->v_type == VAR_FUNC
&& ct->ct_type == VAR_PARTIAL)))
{
- SOURCING_LNUM = iptr->isn_lnum;
- semsg(_(e_expected_str_but_got_str),
- vartype_name(ct->ct_type),
- vartype_name(tv->v_type));
- goto on_error;
+ if (tv->v_type == VAR_NUMBER && ct->ct_type == VAR_BOOL
+ && (tv->vval.v_number == 0
+ || tv->vval.v_number == 1))
+ {
+ // number 0 is FALSE, number 1 is TRUE
+ tv->v_type = VAR_BOOL;
+ tv->vval.v_number = tv->vval.v_number
+ ? VVAL_TRUE : VVAL_FALSE;
+ }
+ else
+ {
+ SOURCING_LNUM = iptr->isn_lnum;
+ semsg(_(e_expected_str_but_got_str),
+ vartype_name(ct->ct_type),
+ vartype_name(tv->v_type));
+ goto on_error;
+ }
}
}
break;