0
0
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:
Shane Harper 2025-03-12 21:12:12 +01:00 committed by Christian Brabandt
parent 7db96134c2
commit 2d18789aa6
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
3 changed files with 32 additions and 9 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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,
/**/ /**/