mirror of
https://github.com/vim/vim.git
synced 2025-12-10 18:46:57 -05:00
patch 9.1.1917: Vim9: incorrect type inference with mkdir()
Problem: Vim9: incorrect type inference with mkdir()
(dezza)
Solution: Before compiling a RHS expression in an assignment, save the
new local variable contents (Yegappan Lakshmanan)
fixes: #18751
closes: #18751
Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
61b73b89a3
commit
a650485ed5
@ -4771,6 +4771,20 @@ def Test_call_modified_import_func()
|
|||||||
v9.CheckScriptSuccess(lines)
|
v9.CheckScriptSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
" Test for assigning the return value of mkdir() to a new local variable.
|
||||||
|
" This used to result in the "E1012: Type mismatch; expected list<any> but
|
||||||
|
" got number" error message.
|
||||||
|
def Test_assign_mkdir_ret_value()
|
||||||
|
var lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def Fn()
|
||||||
|
var ret: number = mkdir('./foo/bar/baz', 'p')
|
||||||
|
enddef
|
||||||
|
defcompile
|
||||||
|
END
|
||||||
|
v9.CheckScriptSuccess(lines)
|
||||||
|
enddef
|
||||||
|
|
||||||
" The following messes up syntax highlight, keep near the end.
|
" The following messes up syntax highlight, keep near the end.
|
||||||
if has('python3')
|
if has('python3')
|
||||||
def Test_python3_command()
|
def Test_python3_command()
|
||||||
|
|||||||
@ -729,6 +729,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 */
|
||||||
|
/**/
|
||||||
|
1917,
|
||||||
/**/
|
/**/
|
||||||
1916,
|
1916,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
@ -3170,6 +3170,8 @@ compile_assign_single_eval_expr(cctx_T *cctx, cac_T *cac)
|
|||||||
int ret = OK;
|
int ret = OK;
|
||||||
char_u *whitep;
|
char_u *whitep;
|
||||||
lhs_T *lhs = &cac->cac_lhs;
|
lhs_T *lhs = &cac->cac_lhs;
|
||||||
|
lvar_T *lvp;
|
||||||
|
lvar_T save_lhs_lvar;
|
||||||
|
|
||||||
// Compile the expression.
|
// Compile the expression.
|
||||||
if (cac->cac_incdec)
|
if (cac->cac_incdec)
|
||||||
@ -3178,7 +3180,14 @@ compile_assign_single_eval_expr(cctx_T *cctx, cac_T *cac)
|
|||||||
// Temporarily hide the new local variable here, it is
|
// Temporarily hide the new local variable here, it is
|
||||||
// not available to this expression.
|
// not available to this expression.
|
||||||
if (lhs->lhs_new_local)
|
if (lhs->lhs_new_local)
|
||||||
|
{
|
||||||
--cctx->ctx_locals.ga_len;
|
--cctx->ctx_locals.ga_len;
|
||||||
|
|
||||||
|
// Save the local variable value (compiling the RHS expression may
|
||||||
|
// create new local variables).
|
||||||
|
lvp = ((lvar_T *)cctx->ctx_locals.ga_data) + cctx->ctx_locals.ga_len;
|
||||||
|
save_lhs_lvar = *lvp;
|
||||||
|
}
|
||||||
whitep = cac->cac_op + cac->cac_oplen;
|
whitep = cac->cac_op + cac->cac_oplen;
|
||||||
|
|
||||||
if (may_get_next_line_error(whitep, &cac->cac_nextc, cctx) == FAIL)
|
if (may_get_next_line_error(whitep, &cac->cac_nextc, cctx) == FAIL)
|
||||||
@ -3190,7 +3199,15 @@ compile_assign_single_eval_expr(cctx_T *cctx, cac_T *cac)
|
|||||||
|
|
||||||
ret = compile_expr0_ext(&cac->cac_nextc, cctx, &cac->cac_is_const);
|
ret = compile_expr0_ext(&cac->cac_nextc, cctx, &cac->cac_is_const);
|
||||||
if (lhs->lhs_new_local)
|
if (lhs->lhs_new_local)
|
||||||
|
{
|
||||||
|
// Restore the local variable value. Update lhs_lvar as the index of
|
||||||
|
// the local variable might have changed.
|
||||||
|
lvp = ((lvar_T *)cctx->ctx_locals.ga_data) + cctx->ctx_locals.ga_len;
|
||||||
|
*lvp = save_lhs_lvar;
|
||||||
|
lhs->lhs_lvar = lvp;
|
||||||
|
|
||||||
++cctx->ctx_locals.ga_len;
|
++cctx->ctx_locals.ga_len;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user