0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

patch 8.0.1423: error in return not caught by try/catch

Problem:    Error in return not caught by try/catch.
Solution:   Call update_force_abort(). (Yasuhiro Matsomoto, closes #2483)
This commit is contained in:
Bram Moolenaar
2017-12-23 17:26:11 +01:00
parent 45a0000d5c
commit fabaf753e2
6 changed files with 24 additions and 2 deletions

View File

@@ -2147,6 +2147,7 @@ test_arglist \
test_edit \ test_edit \
test_erasebackword \ test_erasebackword \
test_escaped_glob \ test_escaped_glob \
test_eval_stuff \
test_ex_undo \ test_ex_undo \
test_ex_z \ test_ex_z \
test_exec_while_if \ test_exec_while_if \

View File

@@ -94,6 +94,7 @@ NEW_TESTS = test_arabic.res \
test_edit.res \ test_edit.res \
test_erasebackword.res \ test_erasebackword.res \
test_escaped_glob.res \ test_escaped_glob.res \
test_eval_stuff.res \
test_exec_while_if.res \ test_exec_while_if.res \
test_exists.res \ test_exists.res \
test_exists_autocmd.res \ test_exists_autocmd.res \

View File

@@ -1,5 +1,7 @@
Test for various eval features. vim: set ft=vim : Test for various eval features. vim: set ft=vim :
NOTE: Do not add more here, use new style test test_eval_stuff.vim
Note: system clipboard is saved, changed and restored. Note: system clipboard is saved, changed and restored.
clipboard contents clipboard contents
@@ -134,10 +136,10 @@ if has('clipboard')
let _clipreg = ['*', getreg('*'), getregtype('*')] let _clipreg = ['*', getreg('*'), getregtype('*')]
let _clipopt = &cb let _clipopt = &cb
let &cb='unnamed' let &cb='unnamed'
5y 7y
AR * AR *
tabdo :windo :echo "hi" tabdo :windo :echo "hi"
6y 8y
AR * AR *
let &cb=_clipopt let &cb=_clipopt
call call('setreg', _clipreg) call call('setreg', _clipreg)

View File

@@ -0,0 +1,13 @@
" Tests for various eval things.
function s:foo() abort
try
return [] == 0
catch
return 1
endtry
endfunction
func Test_catch_return_with_error()
call assert_equal(1, s:foo())
endfunc

View File

@@ -2972,6 +2972,9 @@ ex_return(exarg_T *eap)
/* It's safer to return also on error. */ /* It's safer to return also on error. */
else if (!eap->skip) else if (!eap->skip)
{ {
/* In return statement, cause_abort should be force_abort. */
update_force_abort();
/* /*
* Return unless the expression evaluation has been cancelled due to an * Return unless the expression evaluation has been cancelled due to an
* aborting error, an interrupt, or an exception. * aborting error, an interrupt, or an exception.

View File

@@ -771,6 +771,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1423,
/**/ /**/
1422, 1422,
/**/ /**/