diff options
author | zeertzjq <zeertzjq@outlook.com> | 2025-03-13 08:46:47 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-13 08:46:47 +0800 |
commit | 90d1260cb84c917653987c0dfdfa150b617f5a0f (patch) | |
tree | 518307cc8ae53d8558ff949b3a6827b1d74b3c00 | |
parent | dbd76c2c414e24ed3e961568567a3a60f97cf2fb (diff) | |
download | rneovim-90d1260cb84c917653987c0dfdfa150b617f5a0f.tar.gz rneovim-90d1260cb84c917653987c0dfdfa150b617f5a0f.tar.bz2 rneovim-90d1260cb84c917653987c0dfdfa150b617f5a0f.zip |
vim-patch:9.1.1195: inside try-block: fn body executed with default arg undefined (#32866)
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: vim/vim#16865
https://github.com/vim/vim/commit/2d18789aa67cc60072ea0cf21811c403fa0b2c7b
Co-authored-by: Shane Harper <shane@shaneharper.net>
-rw-r--r-- | src/nvim/eval/userfunc.c | 2 | ||||
-rw-r--r-- | test/old/testdir/test_user_func.vim | 37 |
2 files changed, 30 insertions, 9 deletions
diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c index c5357d507c..89bb1dca9b 100644 --- a/src/nvim/eval/userfunc.c +++ b/src/nvim/eval/userfunc.c @@ -1246,7 +1246,7 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rett int save_did_emsg = did_emsg; 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; } else if (islambda) { char *p = *(char **)fp->uf_lines.ga_data + 7; diff --git a/test/old/testdir/test_user_func.vim b/test/old/testdir/test_user_func.vim index b1543c8f24..d1ed4cb499 100644 --- a/test/old/testdir/test_user_func.vim +++ b/test/old/testdir/test_user_func.vim @@ -166,14 +166,35 @@ func Test_default_arg() \ execute('func Args2')) " Error in default argument expression - let l =<< trim END - func F1(x = y) - return a:x * 2 - endfunc - echo F1() - END - let @a = l->join("\n") - call assert_fails("exe @a", 'E121:') + func! s:f(x = s:undefined) + return a:x + endfunc + call assert_fails('echo s:f()', ['E121: Undefined variable: s:undefined', + \ 'E121: Undefined variable: a:x']) + + func! s:f(x = s:undefined) abort + 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 func s:addFoo(lead) |