From 1d34189ecb99fa76363c06e1aa815c1075675a1c Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 18 Sep 2021 15:25:52 +0200 Subject: 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) --- src/testdir/test_trycatch.vim | 28 +++++++++++++++++++++++++++- src/userfunc.c | 8 +++++--- src/version.c | 2 ++ 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 @@ -757,6 +757,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3448, /**/ 3447, /**/ -- cgit v1.2.1