# HG changeset patch # User Bram Moolenaar # Date 1599930903 -7200 # Node ID 939f7184566f46b0eb0916d604af8a52aa4ca9c1 # Parent 27c33305cb9c579abc320071554f6aacdadf1c0a patch 8.2.1668: Vim9: not accepting 0 or 1 as bool when type is any Commit: https://github.com/vim/vim/commit/dadaddd59f3b53c41e92dc42219ab006deb14109 Author: Bram Moolenaar Date: Sat Sep 12 19:11:23 2020 +0200 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 https://github.com/vim/vim/issues/6913) diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -2369,6 +2369,9 @@ def Test_expr7_method_call() 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 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1668, +/**/ 1667, /**/ 1666, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2510,11 +2510,23 @@ call_def_function( || (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;