mirror of
https://github.com/vim/vim.git
synced 2025-08-26 20:03:41 -04:00
patch 9.1.1195: inside try-block: fn body executed with default arg undefined
Problem: inside try-block: fn body executed when default arg is undefined Solution: When inside a try-block do not execute function body after an error in evaluating a default argument expression (Shane Harper). closes: #16865 Signed-off-by: Shane Harper <shane@shaneharper.net> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
parent
7db96134c2
commit
2d18789aa6
@ -161,14 +161,35 @@ func Test_default_arg()
|
|||||||
\ execute('func Args2'))
|
\ execute('func Args2'))
|
||||||
|
|
||||||
" Error in default argument expression
|
" Error in default argument expression
|
||||||
let l =<< trim END
|
func! s:f(x = s:undefined)
|
||||||
func F1(x = y)
|
return a:x
|
||||||
return a:x * 2
|
endfunc
|
||||||
endfunc
|
call assert_fails('echo s:f()', ['E121: Undefined variable: s:undefined',
|
||||||
echo F1()
|
\ 'E121: Undefined variable: a:x'])
|
||||||
END
|
|
||||||
let @a = l->join("\n")
|
func! s:f(x = s:undefined) abort
|
||||||
call assert_fails("exe @a", 'E121:')
|
return a:x
|
||||||
|
endfunc
|
||||||
|
const expected_error = 'E121: Undefined variable: s:undefined'
|
||||||
|
" Only one error should be output; execution of the function should be aborted
|
||||||
|
" after the default argument expression error.
|
||||||
|
call assert_fails('echo s:f()', [expected_error, expected_error])
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_default_argument_expression_error_while_inside_of_a_try_block()
|
||||||
|
func! s:f(v = s:undefined_variable)
|
||||||
|
let s:entered_fn_body = 1
|
||||||
|
return a:v
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
unlet! s:entered_fn_body
|
||||||
|
try
|
||||||
|
call s:f()
|
||||||
|
throw "No exception."
|
||||||
|
catch
|
||||||
|
call assert_exception("E121: Undefined variable: s:undefined_variable")
|
||||||
|
endtry
|
||||||
|
call assert_false(exists('s:entered_fn_body'), "exists('s:entered_fn_body')")
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func s:addFoo(lead)
|
func s:addFoo(lead)
|
||||||
|
@ -3275,7 +3275,7 @@ call_user_func(
|
|||||||
save_did_emsg = did_emsg;
|
save_did_emsg = did_emsg;
|
||||||
did_emsg = FALSE;
|
did_emsg = FALSE;
|
||||||
|
|
||||||
if (default_arg_err && (fp->uf_flags & FC_ABORT))
|
if (default_arg_err && (fp->uf_flags & FC_ABORT || trylevel > 0 ))
|
||||||
{
|
{
|
||||||
did_emsg = TRUE;
|
did_emsg = TRUE;
|
||||||
retval = FCERR_FAILED;
|
retval = FCERR_FAILED;
|
||||||
|
@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
1195,
|
||||||
/**/
|
/**/
|
||||||
1194,
|
1194,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user