1
0
forked from aniani/vim

patch 8.2.2010: Vim9: compiling fails for unreachable return statement

Problem:    Vim9: compiling fails for unreachable return statement.
Solution:   Fix it. (closes #7319)
This commit is contained in:
Bram Moolenaar
2020-11-18 16:35:02 +01:00
parent 382319211a
commit 8e02faf4e9
3 changed files with 24 additions and 14 deletions

View File

@@ -749,6 +749,9 @@ def Test_disassemble_const_expr()
enddef enddef
def ReturnInIf(): string def ReturnInIf(): string
if 1 < 0
return "maybe"
endif
if g:cond if g:cond
return "yes" return "yes"
else else
@@ -759,6 +762,9 @@ enddef
def Test_disassemble_return_in_if() def Test_disassemble_return_in_if()
var instr = execute('disassemble ReturnInIf') var instr = execute('disassemble ReturnInIf')
assert_match('ReturnInIf\_s*' .. assert_match('ReturnInIf\_s*' ..
'if 1 < 0\_s*' ..
' return "maybe"\_s*' ..
'endif\_s*' ..
'if g:cond\_s*' .. 'if g:cond\_s*' ..
'0 LOADG g:cond\_s*' .. '0 LOADG g:cond\_s*' ..
'1 COND2BOOL\_s*' .. '1 COND2BOOL\_s*' ..

View File

@@ -750,6 +750,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 */
/**/
2010,
/**/ /**/
2009, 2009,
/**/ /**/

View File

@@ -4694,21 +4694,24 @@ compile_return(char_u *arg, int set_return_type, cctx_T *cctx)
if (compile_expr0(&p, cctx) == FAIL) if (compile_expr0(&p, cctx) == FAIL)
return NULL; return NULL;
stack_type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; if (cctx->ctx_skip != SKIP_YES)
if (set_return_type)
cctx->ctx_ufunc->uf_ret_type = stack_type;
else
{ {
if (cctx->ctx_ufunc->uf_ret_type->tt_type == VAR_VOID stack_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
&& stack_type->tt_type != VAR_VOID if (set_return_type)
&& stack_type->tt_type != VAR_UNKNOWN) cctx->ctx_ufunc->uf_ret_type = stack_type;
else
{ {
emsg(_(e_returning_value_in_function_without_return_type)); if (cctx->ctx_ufunc->uf_ret_type->tt_type == VAR_VOID
return NULL; && stack_type->tt_type != VAR_VOID
} && stack_type->tt_type != VAR_UNKNOWN)
if (need_type(stack_type, cctx->ctx_ufunc->uf_ret_type, -1, {
emsg(_(e_returning_value_in_function_without_return_type));
return NULL;
}
if (need_type(stack_type, cctx->ctx_ufunc->uf_ret_type, -1,
cctx, FALSE, FALSE) == FAIL) cctx, FALSE, FALSE) == FAIL)
return NULL; return NULL;
}
} }
} }
else else
@@ -4725,8 +4728,7 @@ compile_return(char_u *arg, int set_return_type, cctx_T *cctx)
// No argument, return zero. // No argument, return zero.
generate_PUSHNR(cctx, 0); generate_PUSHNR(cctx, 0);
} }
if (cctx->ctx_skip != SKIP_YES && generate_instr(cctx, ISN_RETURN) == NULL)
if (generate_instr(cctx, ISN_RETURN) == NULL)
return NULL; return NULL;
// "return val | endif" is possible // "return val | endif" is possible