mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.2.3326: Vim9: no error passing an empty list of the wrong type
Problem: Vim9: no error passing an empty list of the wrong type. Solution: Use ISN_SETTYPE also for "list<any>". (closes #8732)
This commit is contained in:
@@ -435,6 +435,7 @@ def Test_disassemble_list_assign()
|
|||||||
'\d STORE $1\_s*' ..
|
'\d STORE $1\_s*' ..
|
||||||
'var l: list<any>\_s*' ..
|
'var l: list<any>\_s*' ..
|
||||||
'\d NEWLIST size 0\_s*' ..
|
'\d NEWLIST size 0\_s*' ..
|
||||||
|
'\d SETTYPE list<any>\_s*' ..
|
||||||
'\d STORE $2\_s*' ..
|
'\d STORE $2\_s*' ..
|
||||||
'\[x, y; l\] = g:stringlist\_s*' ..
|
'\[x, y; l\] = g:stringlist\_s*' ..
|
||||||
'\d LOADG g:stringlist\_s*' ..
|
'\d LOADG g:stringlist\_s*' ..
|
||||||
|
@@ -2930,6 +2930,27 @@ def Test_check_func_arg_types()
|
|||||||
CheckScriptFailure(lines + ['echo H(G(F2))'], 'E1013:')
|
CheckScriptFailure(lines + ['echo H(G(F2))'], 'E1013:')
|
||||||
enddef
|
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()
|
def Test_compile_error()
|
||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
def g:Broken()
|
def g:Broken()
|
||||||
|
@@ -755,6 +755,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
3326,
|
||||||
/**/
|
/**/
|
||||||
3325,
|
3325,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -1598,7 +1598,7 @@ generate_NEWLIST(cctx_T *cctx, int count)
|
|||||||
|
|
||||||
// get the member type from all the items on the stack.
|
// get the member type from all the items on the stack.
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
member = &t_void;
|
member = &t_unknown;
|
||||||
else
|
else
|
||||||
member = get_member_type_from_stack(
|
member = get_member_type_from_stack(
|
||||||
((type_T **)stack->ga_data) + stack->ga_len, count, 1,
|
((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_DICT
|
||||||
|| lhs.lhs_type->tt_type == VAR_LIST)
|
|| lhs.lhs_type->tt_type == VAR_LIST)
|
||||||
&& lhs.lhs_type->tt_member != NULL
|
&& 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)
|
&& lhs.lhs_type->tt_member != &t_unknown)
|
||||||
// Set the type in the list or dict, so that it can be checked,
|
// 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);
|
generate_SETTYPE(cctx, lhs.lhs_type);
|
||||||
|
|
||||||
if (generate_store_lhs(cctx, &lhs, instr_count) == FAIL)
|
if (generate_store_lhs(cctx, &lhs, instr_count) == FAIL)
|
||||||
|
Reference in New Issue
Block a user