changeset 25826:5040fae521f6 v8.2.3448

patch 8.2.3448: :endtry after function call that throws not found Commit: https://github.com/vim/vim/commit/1d34189ecb99fa76363c06e1aa815c1075675a1c Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 18 15:25:52 2021 +0200 patch 8.2.3448: :endtry after function call that throws not found Problem: :endtry after function call that throws not found. Solution: Do check for following :endtry if an exception is being thrown. (closes #8889)
author Bram Moolenaar <Bram@vim.org>
date Sat, 18 Sep 2021 15:30:04 +0200
parents 9b12bc041450
children cf5792551408
files src/testdir/test_trycatch.vim src/userfunc.c src/version.c
diffstat 3 files changed, 34 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_trycatch.vim
+++ b/src/testdir/test_trycatch.vim
@@ -2236,7 +2236,7 @@ func Test_user_command_throw_in_function
       catch /my_error/
         let caught = 'yes'
       catch
-        let caught = 'no'
+        let caught = v:exception
       endtry
       call assert_equal('yes', caught)
   END
@@ -2247,6 +2247,32 @@ func Test_user_command_throw_in_function
   unlet g:caught
 endfunc
 
+" Test for using throw in a called function with following endtry    {{{1
+func Test_user_command_function_call_with_endtry()
+  let lines =<< trim END
+      funct s:throw(msg) abort
+        throw a:msg
+      endfunc
+      func s:main() abort
+        try
+          try
+            throw 'err1'
+          catch
+            call s:throw('err2') | endtry
+          catch
+            let s:caught = 'yes'
+        endtry
+      endfunc
+
+      call s:main()
+      call assert_equal('yes', s:caught)
+  END
+  call writefile(lines, 'XtestThrow')
+  source XtestThrow
+
+  call delete('XtestThrow')
+endfunc
+
 
 " Modeline								    {{{1
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -5011,14 +5011,16 @@ ex_call(exarg_T *eap)
 	--emsg_skip;
     clear_evalarg(&evalarg, eap);
 
-    // When inside :try we need to check for following "| catch".
-    if (!aborting() && (!failed || eap->cstack->cs_trylevel > 0))
+    // When inside :try we need to check for following "| catch" or "| endtry".
+    // Not when there was an error, but do check if an exception was thrown.
+    if ((!aborting() || did_throw)
+				  && (!failed || eap->cstack->cs_trylevel > 0))
     {
 	// Check for trailing illegal characters and a following command.
 	arg = skipwhite(arg);
 	if (!ends_excmd2(eap->arg, arg))
 	{
-	    if (!failed)
+	    if (!failed && !aborting())
 	    {
 		emsg_severe = TRUE;
 		semsg(_(e_trailing_arg), arg);
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3448,
+/**/
     3447,
 /**/
     3446,