summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-09-18 15:25:52 +0200
committerBram Moolenaar <Bram@vim.org>2021-09-18 15:25:52 +0200
commit1d34189ecb99fa76363c06e1aa815c1075675a1c (patch)
tree8a103c189a514d84c27fe765facf7406f0d9059f
parentd2b98ab4ecf168514ae622948e3749dea7671946 (diff)
downloadvim-git-8.2.3448.tar.gz
patch 8.2.3448: :endtry after function call that throws not foundv8.2.3448
Problem: :endtry after function call that throws not found. Solution: Do check for following :endtry if an exception is being thrown. (closes #8889)
-rw-r--r--src/testdir/test_trycatch.vim28
-rw-r--r--src/userfunc.c8
-rw-r--r--src/version.c2
3 files changed, 34 insertions, 4 deletions
diff --git a/src/testdir/test_trycatch.vim b/src/testdir/test_trycatch.vim
index 702d6dabb..052fab7bb 100644
--- a/src/testdir/test_trycatch.vim
+++ b/src/testdir/test_trycatch.vim
@@ -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
diff --git a/src/userfunc.c b/src/userfunc.c
index dc0a939eb..ab441405c 100644
--- 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);
diff --git a/src/version.c b/src/version.c
index 9cd1495ac..38f901757 100644
--- 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,