diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-10-04 18:52:19 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-10-04 18:52:19 +0100 |
commit | a684a684096ecef3fbaee39c573b47423235d6b1 (patch) | |
tree | 387ee22bdbd6a9d0483b695cb09686c7af9b1fa2 /src | |
parent | 50c56893423eb6ad2154a4151e67f7097f52efb6 (diff) |
patch 8.2.3470: crash with error in :catch and also in :finallyv8.2.3470
Problem: Crash with error in :catch and also in :finally.
Solution: Only discard an exception if there is one. (closes #8954)
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_eval.c | 3 | ||||
-rw-r--r-- | src/testdir/test_trycatch.vim | 12 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 16 insertions, 1 deletions
diff --git a/src/ex_eval.c b/src/ex_eval.c index 259cf670cc..503a3ae02a 100644 --- a/src/ex_eval.c +++ b/src/ex_eval.c @@ -2374,7 +2374,8 @@ cleanup_conditionals( default: if (cstack->cs_flags[idx] & CSF_FINALLY) { - if (cstack->cs_pending[idx] & CSTP_THROW) + if ((cstack->cs_pending[idx] & CSTP_THROW) + && cstack->cs_exception[idx] != NULL) { // Cancel the pending exception. This is in the // finally clause, so that the stack of the diff --git a/src/testdir/test_trycatch.vim b/src/testdir/test_trycatch.vim index 052fab7bb7..ac12671da6 100644 --- a/src/testdir/test_trycatch.vim +++ b/src/testdir/test_trycatch.vim @@ -2273,6 +2273,18 @@ func Test_user_command_function_call_with_endtry() call delete('XtestThrow') endfunc +func ThisWillFail() + try + if x | endif + catch + for l in [] + finally +endfunc + +func Test_error_in_catch_and_finally() + call assert_fails('call ThisWillFail()', ['E121:', 'E600:']) +endfunc + " Modeline {{{1 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index d15495ec5d..23b0c3682c 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 */ /**/ + 3470, +/**/ 3469, /**/ 3468, |