]> granicus.if.org Git - vim/commitdiff
patch 8.2.3448: :endtry after function call that throws not found v8.2.3448
authorBram Moolenaar <Bram@vim.org>
Sat, 18 Sep 2021 13:25:52 +0000 (15:25 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 18 Sep 2021 13:25:52 +0000 (15:25 +0200)
Problem:    :endtry after function call that throws not found.
Solution:   Do check for following :endtry if an exception is being thrown.
            (closes #8889)

src/testdir/test_trycatch.vim
src/userfunc.c
src/version.c

index 702d6dabb610d422b79f2231442c3ec552a9dbbb..052fab7bb7d3cbd71723c90545e1aae04f8ae8ed 100644 (file)
@@ -2236,7 +2236,7 @@ func Test_user_command_throw_in_function_call()
       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_call()
   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
index dc0a939eb6e0098ec3a5af74163d64189bc64a0f..ab441405c535fe77eba8f313df3b7c5e60ecb486 100644 (file)
@@ -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);
index 9cd1495ace72e43309e8d104609d95f897308c78..38f9017575e0965888258b6fe26b17d849f932bb 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3448,
 /**/
     3447,
 /**/