]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1195: inside try-block: fn body executed with default arg undefined v9.1.1195
authorShane Harper <shane@shaneharper.net>
Wed, 12 Mar 2025 20:12:12 +0000 (21:12 +0100)
committerChristian Brabandt <cb@256bit.org>
Wed, 12 Mar 2025 20:12:12 +0000 (21:12 +0100)
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>
src/testdir/test_user_func.vim
src/userfunc.c
src/version.c

index af7d466f6bb4be1c352853daa1b5dea5e4605b7b..b9f6a40e80825c227f76489be65620d62ce520df 100644 (file)
@@ -161,14 +161,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)
index 531b67a550271200c380cb551157c7fce90b660f..d8d7014aa16a9af98ba9de40c7dbb1df3796dc61 100644 (file)
@@ -3275,7 +3275,7 @@ call_user_func(
     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;
        retval = FCERR_FAILED;
index 33758889dd7934036710a71d60c8ed172c5f9370..6297c2b4a16da9a338509217dbb356c28246c99a 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1195,
 /**/
     1194,
 /**/