diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-08-10 22:52:02 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-08-10 22:52:02 +0200 |
commit | 6e48b84c5f08a7e192817aca0d8278ea2ff82bc7 (patch) | |
tree | 758e2a39e5d00fb778df762e8071768a7362857e | |
parent | 52eb372a04dfc5d5afef238c1b3c4a8e92020837 (diff) |
patch 8.2.3326: Vim9: no error passing an empty list of the wrong typev8.2.3326
Problem: Vim9: no error passing an empty list of the wrong type.
Solution: Use ISN_SETTYPE also for "list<any>". (closes #8732)
-rw-r--r-- | src/testdir/test_vim9_disassemble.vim | 1 | ||||
-rw-r--r-- | src/testdir/test_vim9_func.vim | 21 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 11 |
4 files changed, 32 insertions, 3 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim index 9eaa8647f3..1d1730e004 100644 --- a/src/testdir/test_vim9_disassemble.vim +++ b/src/testdir/test_vim9_disassemble.vim @@ -435,6 +435,7 @@ def Test_disassemble_list_assign() '\d STORE $1\_s*' .. 'var l: list<any>\_s*' .. '\d NEWLIST size 0\_s*' .. + '\d SETTYPE list<any>\_s*' .. '\d STORE $2\_s*' .. '\[x, y; l\] = g:stringlist\_s*' .. '\d LOADG g:stringlist\_s*' .. diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index de7b980fde..f8d3f59b2e 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -2930,6 +2930,27 @@ def Test_check_func_arg_types() CheckScriptFailure(lines + ['echo H(G(F2))'], 'E1013:') enddef +def Test_list_any_type_checked() + var lines =<< trim END + vim9script + def Foo() + --decl-- + Bar(l) + enddef + def Bar(ll: list<dict<any>>) + enddef + Foo() + END + lines[2] = 'var l: list<any>' + CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<any>', 2) + + lines[2] = 'var l: list<any> = []' + CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<any>', 2) + + lines[2] = 'var l: list<any> = [11]' + CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list<dict<any>> but got list<number>', 2) +enddef + def Test_compile_error() var lines =<< trim END def g:Broken() diff --git a/src/version.c b/src/version.c index 04b5749bf1..5383ba3440 100644 --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3326, +/**/ 3325, /**/ 3324, diff --git a/src/vim9compile.c b/src/vim9compile.c index 127d5a69d4..c2becbe5de 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1598,7 +1598,7 @@ generate_NEWLIST(cctx_T *cctx, int count) // get the member type from all the items on the stack. if (count == 0) - member = &t_void; + member = &t_unknown; else member = get_member_type_from_stack( ((type_T **)stack->ga_data) + stack->ga_len, count, 1, @@ -7190,10 +7190,15 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx) && (lhs.lhs_type->tt_type == VAR_DICT || lhs.lhs_type->tt_type == VAR_LIST) && lhs.lhs_type->tt_member != NULL - && lhs.lhs_type->tt_member != &t_any + && !(lhs.lhs_type->tt_member == &t_any + && oplen > 0 + && rhs_type != NULL + && rhs_type->tt_type == lhs.lhs_type->tt_type + && rhs_type->tt_member != &t_unknown) && lhs.lhs_type->tt_member != &t_unknown) // Set the type in the list or dict, so that it can be checked, - // also in legacy script. + // also in legacy script. Not for "list<any> = val", then the + // type of "val" is used. generate_SETTYPE(cctx, lhs.lhs_type); if (generate_store_lhs(cctx, &lhs, instr_count) == FAIL) |