summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-09-09 18:54:42 +0200
committerBram Moolenaar <Bram@vim.org>2020-09-09 18:54:42 +0200
commitba7c0d7b4ce03336b4aebe1959c1a8342fa6dbd4 (patch)
tree4e0d3369a2304c30e9013bb2662ba5f453a72232
parent96f8f499ce51ea791d9b044c266f84380fa54848 (diff)
downloadvim-git-ba7c0d7b4ce03336b4aebe1959c1a8342fa6dbd4.tar.gz
patch 8.2.1644: Vim9: cannot assign 1 and 0 to bool at script levelv8.2.1644
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.
-rw-r--r--src/testdir/test_vim9_expr.vim2
-rw-r--r--src/testdir/test_vim9_script.vim24
-rw-r--r--src/testdir/vim9.vim2
-rw-r--r--src/version.c2
-rw-r--r--src/vim9type.c24
5 files changed, 43 insertions, 11 deletions
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 3c16fa48e..8cf5bc0d6 100644
--- 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
index 5712e3842..36e39eb05 100644
--- 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
index 7fbe4a5ed..2e4b03f49 100644
--- 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<string>, error: string, lnum = -3)
+def CheckDefAndScriptFailure(lines: list<string>, 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
index 18d2b3ed8..1d1e00e61 100644
--- 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
index 4f4876da0..43710fc0f 100644
--- 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_gap)
}
}
- 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;
}
/*