patch 8.2.2370: Vim9: command fails in catch block
Problem: Vim9: command fails in catch block.
Solution: Reset force_abort and need_rethrow. (closes #7692)
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 158c64c..478c394 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -558,6 +558,43 @@
assert_equal(411, n)
enddef
+def Test_cnext_works_in_catch()
+ var lines =<< trim END
+ vim9script
+ au BufEnter * eval 0
+ writefile(['text'], 'Xfile1')
+ writefile(['text'], 'Xfile2')
+ var items = [
+ {lnum: 1, filename: 'Xfile1', valid: true},
+ {lnum: 1, filename: 'Xfile2', valid: true}
+ ]
+ setqflist([], ' ', {items: items})
+ cwindow
+
+ def CnextOrCfirst()
+ # if cnext fails, cfirst is used
+ try
+ cnext
+ catch
+ cfirst
+ endtry
+ enddef
+
+ CnextOrCfirst()
+ CnextOrCfirst()
+ writefile([getqflist({idx: 0}).idx], 'Xresult')
+ qall
+ END
+ writefile(lines, 'XCatchCnext')
+ RunVim([], [], '--clean -S XCatchCnext')
+ assert_equal(['1'], readfile('Xresult'))
+
+ delete('Xfile1')
+ delete('Xfile2')
+ delete('XCatchCnext')
+ delete('Xresult')
+enddef
+
def Test_throw_skipped()
if 0
throw dontgethere
diff --git a/src/version.c b/src/version.c
index 3ac6cfa..ecb0c43 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2370,
+/**/
2369,
/**/
2368,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index b24475e..fdc49eb 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -2572,6 +2572,7 @@
trycmd->tcd_caught = TRUE;
}
did_emsg = got_int = did_throw = FALSE;
+ force_abort = need_rethrow = FALSE;
catch_exception(current_exception);
}
break;