changeset 13096:30f9a62f5f51 v8.0.1423

patch 8.0.1423: error in return not caught by try/catch commit https://github.com/vim/vim/commit/fabaf753e26df5a89a854673d14c15a1fa6b321a Author: Bram Moolenaar <Bram@vim.org> Date: Sat Dec 23 17:26:11 2017 +0100 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 https://github.com/vim/vim/issues/2483)
author Christian Brabandt <cb@256bit.org>
date Sat, 23 Dec 2017 17:30:05 +0100
parents 7fc56b475604
children 396d5f903d26
files src/Makefile src/testdir/Make_all.mak src/testdir/test_eval.in src/testdir/test_eval_stuff.vim src/userfunc.c src/version.c
diffstat 6 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile
+++ b/src/Makefile
@@ -2147,6 +2147,7 @@ test_arglist \
 	test_edit \
 	test_erasebackword \
 	test_escaped_glob \
+	test_eval_stuff \
 	test_ex_undo \
 	test_ex_z \
 	test_exec_while_if \
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -94,6 +94,7 @@ NEW_TESTS = test_arabic.res \
 	    test_edit.res \
 	    test_erasebackword.res \
 	    test_escaped_glob.res \
+	    test_eval_stuff.res \
 	    test_exec_while_if.res \
 	    test_exists.res \
 	    test_exists_autocmd.res \
--- a/src/testdir/test_eval.in
+++ b/src/testdir/test_eval.in
@@ -1,5 +1,7 @@
 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.
 
 clipboard contents
@@ -134,10 +136,10 @@ if has('clipboard')
 let _clipreg = ['*', getreg('*'), getregtype('*')]
 let _clipopt = &cb
 let &cb='unnamed'
-5y
+7y
 AR *
 tabdo :windo :echo "hi"
-6y
+8y
 AR *
 let &cb=_clipopt
 call call('setreg', _clipreg)
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_eval_stuff.vim
@@ -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
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -2972,6 +2972,9 @@ ex_return(exarg_T *eap)
     /* It's safer to return also on error. */
     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
 	 * aborting error, an interrupt, or an exception.
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1423,
+/**/
     1422,
 /**/
     1421,