# HG changeset patch # User Bram Moolenaar # Date 1599670804 -7200 # Node ID da851f3b6a0b7823c9d8240b9e4eecac7cc6326a # Parent c0aafebff6d9b278bff2364afa0245c4441bf659 patch 8.2.1644: Vim9: cannot assign 1 and 0 to bool at script level Commit: https://github.com/vim/vim/commit/ba7c0d7b4ce03336b4aebe1959c1a8342fa6dbd4 Author: Bram Moolenaar Date: Wed Sep 9 18:54:42 2020 +0200 patch 8.2.1644: Vim9: cannot assign 1 and 0 to bool at script level Problem: Vim9: cannot assign 1 and 0 to bool at script level. Solution: Add the TTFLAG_BOOL_OK flag to the type. Fix name of test function. 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 @@ -2382,7 +2382,7 @@ func Test_expr_fails() call CheckDefFailure(["CallMe ('yes')"], 'E476:', 1) call CheckScriptFailure(["CallMe ('yes')"], 'E492:', 1) - call CheckScriptAndDefFailure(["CallMe2('yes','no')"], 'E1069:', 1) + call CheckDefAndScriptFailure(["CallMe2('yes','no')"], 'E1069:', 1) call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:', 1) call CheckDefFailure(["v:nosuch += 3"], 'E1001:', 1) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -39,7 +39,7 @@ let g:alist = [7] let g:astring = 'text' let g:anumber = 123 -def Test_assignment() +def Test_assignment_bool() let bool1: bool = true assert_equal(v:true, bool1) let bool2: bool = false @@ -50,6 +50,25 @@ def Test_assignment() let bool4: bool = 1 assert_equal(1, bool4) + let lines =<< trim END + vim9script + def GetFlag(): bool + let flag: bool = 1 + return flag + enddef + let flag: bool = GetFlag() + flag = 0 + flag = 1 + END + CheckScriptSuccess(lines) + CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:') + CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:') + CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:') + CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:') + CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:') +enddef + +def Test_assignment() CheckDefFailure(['let x:string'], 'E1069:') CheckDefFailure(['let x:string = "x"'], 'E1069:') CheckDefFailure(['let a:string = "x"'], 'E1069:') @@ -164,8 +183,7 @@ def Test_assignment() assert_equal('xxx', &t_TI) &t_TI = save_TI END - CheckDefSuccess(lines) - CheckScriptSuccess(['vim9script'] + lines) + CheckDefAndScriptSuccess(lines) CheckDefFailure(['&t_TI = 123'], 'E1012:') CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:') diff --git a/src/testdir/vim9.vim b/src/testdir/vim9.vim --- a/src/testdir/vim9.vim +++ b/src/testdir/vim9.vim @@ -48,7 +48,7 @@ enddef " Check that a command fails both when used in a :def function and when used " in Vim9 script. -def CheckScriptAndDefFailure(lines: list, error: string, lnum = -3) +def CheckDefAndScriptFailure(lines: list, error: string, lnum = -3) CheckDefFailure(lines, error, lnum) CheckScriptFailure(['vim9script'] + lines, error, lnum + 1) enddef diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1644, +/**/ 1643, /**/ 1642, diff --git a/src/vim9type.c b/src/vim9type.c --- a/src/vim9type.c +++ b/src/vim9type.c @@ -202,11 +202,23 @@ func_type_add_arg_types( type_T * typval2type(typval_T *tv, garray_T *type_gap) { - type_T *actual; + type_T *type; type_T *member_type; if (tv->v_type == VAR_NUMBER) + { + if (tv->vval.v_number == 0 || tv->vval.v_number == 1) + { + // number 0 and 1 can also be used for bool + type = alloc_type(type_gap); + if (type == NULL) + return NULL; + type->tt_type = VAR_NUMBER; + type->tt_flags = TTFLAG_BOOL_OK; + return type; + } return &t_number; + } if (tv->v_type == VAR_BOOL) return &t_bool; // not used if (tv->v_type == VAR_STRING) @@ -276,13 +288,13 @@ typval2type(typval_T *tv, garray_T *type } } - actual = alloc_type(type_gap); - if (actual == NULL) + type = alloc_type(type_gap); + if (type == NULL) return NULL; - actual->tt_type = tv->v_type; - actual->tt_member = &t_any; + type->tt_type = tv->v_type; + type->tt_member = &t_any; - return actual; + return type; } /*