summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-08-10 22:52:02 +0200
committerBram Moolenaar <Bram@vim.org>2021-08-10 22:52:02 +0200
commit6e48b84c5f08a7e192817aca0d8278ea2ff82bc7 (patch)
tree758e2a39e5d00fb778df762e8071768a7362857e
parent52eb372a04dfc5d5afef238c1b3c4a8e92020837 (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.vim1
-rw-r--r--src/testdir/test_vim9_func.vim21
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c11
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)