vim-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 vim/vim#8889)
1d34189ecb

Nvim obsoleted did_throw; check current_exception is not NULL instead.
This commit is contained in:
Sean Dewar 2021-10-09 01:34:18 +01:00 committed by zeertzjq
parent b6026337f2
commit 93c72d866b
2 changed files with 31 additions and 4 deletions

View File

@ -3017,11 +3017,12 @@ void ex_call(exarg_T *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() || current_exception != NULL) && (!failed || eap->cstack->cs_trylevel > 0)) {
// Check for trailing illegal characters and a following command.
if (!ends_excmd(*arg)) {
if (!failed) {
if (!failed && !aborting()) {
emsg_severe = true;
emsg(_(e_trailing));
}

View File

@ -2008,7 +2008,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
@ -2019,6 +2019,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