aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2025-03-13 08:46:47 +0800
committerGitHub <noreply@github.com>2025-03-13 08:46:47 +0800
commit90d1260cb84c917653987c0dfdfa150b617f5a0f (patch)
tree518307cc8ae53d8558ff949b3a6827b1d74b3c00
parentdbd76c2c414e24ed3e961568567a3a60f97cf2fb (diff)
downloadrneovim-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.c2
-rw-r--r--test/old/testdir/test_user_func.vim37
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)