diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 9c3deb6..8ac39e2 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -1326,14 +1326,6 @@
 # Target to run individual tests.
 VIMTESTTARGET = $(VIM).exe
 
-OLD_TEST_OUTFILES = \
-	$(SCRIPTS_FIRST) \
-	$(SCRIPTS_ALL) \
-	$(SCRIPTS_MORE1) \
-	$(SCRIPTS_MORE4) \
-	$(SCRIPTS_WIN32) \
-	$(SCRIPTS_GUI)
-
 all:	$(MAIN_TARGET) \
 	vimrun.exe \
 	install.exe \
@@ -1485,9 +1477,9 @@
 	$(MAKE) /NOLOGO -f Make_dos.mak clean
 	cd ..
 
-# Run individual OLD style test.
+# Run test1 to bootstrap tests
 # These do not depend on the executable, compile it when needed.
-$(OLD_TEST_OUTFILES:.out=):
+$(SCRIPTS_FIRST:.out=):
 	cd testdir
 	- if exist $@.out del $@.out
 	$(MAKE) /NOLOGO -f Make_dos.mak VIMPROG=..\$(VIMTESTTARGET) nolog
diff --git a/src/Makefile b/src/Makefile
index 55c3664..5d73fc9 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2259,8 +2259,6 @@
 #
 # This will produce a lot of garbage on your screen, including a few error
 # messages.  Don't worry about that.
-# If there is a real error, there will be a difference between "testXX.out" and
-# a "testXX.ok" file.
 # If everything is alright, the final message will be "ALL DONE".  If not you
 # get "TEST FAILURE".
 #
@@ -2311,9 +2309,9 @@
 			CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"; \
 	fi
 
-# Run individual OLD style test.
-# These do not depend on the executable, compile it when needed.
-test1 test49:
+# Run test1, used to bootstrap tests.
+# This does not depend on the executable, compile first it when needed.
+test1:
 	cd testdir; rm -f $@.out; $(MAKE) -f Makefile $@.out VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE)
 
 # Run individual NEW style test.
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 0900a6c..57ba651 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -10,24 +10,6 @@
 # The first script creates small.vim.
 SCRIPTS_FIRST = test1.out
 
-# Tests that run on all systems.
-SCRIPTS_ALL =
-
-# Tests that run on most systems, but not on Amiga.
-SCRIPTS_MORE1 =
-
-# Tests that run on most systems, but not on Amiga and DOS/Windows.
-SCRIPTS_MORE2 = test49.out
-
-# Tests that run on most systems, but not on VMS
-SCRIPTS_MORE4 =
-
-# Tests specifically for MS-Windows.
-SCRIPTS_WIN32 =
-
-# Tests for the GUI.
-SCRIPTS_GUI =
-
 # Tests for Vim9 script.
 TEST_VIM9 = \
 	test_vim9_cmd \
diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak
index e6e55e3..efd5808 100644
--- a/src/testdir/Make_amiga.mak
+++ b/src/testdir/Make_amiga.mak
@@ -9,14 +9,9 @@
 
 include Make_all.mak
 
-SCRIPTS = $(SCRIPTS_ALL) $(SCRIPTS_MORE4)
+.SUFFIXES: .in .out .res .vim
 
-# Must run test1 first to create small.vim.
-$(SCRIPTS) $(SCRIPTS_GUI) $(NEW_TESTS_RES): $(SCRIPTS_FIRST)
-
-.SUFFIXES: .in .out
-
-nongui:	/tmp $(SCRIPTS_FIRST) $(SCRIPTS)
+nongui:	/tmp $(SCRIPTS_FIRST)
 	csh -c echo ALL DONE
 
 clean:
diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak
index f97b3e9..5931da2 100644
--- a/src/testdir/Make_dos.mak
+++ b/src/testdir/Make_dos.mak
@@ -9,25 +9,20 @@
 
 !include Make_all.mak
 
-# Omitted:
-# test49	fails in various ways
-
-SCRIPTS = $(SCRIPTS_ALL) $(SCRIPTS_MORE1) $(SCRIPTS_MORE4)
-
-TEST_OUTFILES = $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_WIN32) $(SCRIPTS_GUI)
+TEST_OUTFILES = $(SCRIPTS_FIRST)
 DOSTMP = dostmp
 DOSTMP_OUTFILES = $(TEST_OUTFILES:test=dostmp\test)
 DOSTMP_INFILES = $(DOSTMP_OUTFILES:.out=.in)
 
 .SUFFIXES: .in .out .res .vim
 
-nongui:	nolog $(SCRIPTS_FIRST) $(SCRIPTS) newtests report
+nongui:	nolog $(SCRIPTS_FIRST) newtests report
 
 small:	nolog report
 
-gui:	nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) newtests report
+gui:	nolog $(SCRIPTS_FIRST) newtests report
 
-win32:	nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_WIN32) newtests report
+win32:	nolog $(SCRIPTS_FIRST) newtests report
 
 # Copy the input files to dostmp, changing the fileformat to dos.
 $(DOSTMP_INFILES): $(*B).in
diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak
index e1f3467..b34ae1d 100644
--- a/src/testdir/Make_ming.mak
+++ b/src/testdir/Make_ming.mak
@@ -28,19 +28,17 @@
 
 include Make_all.mak
 
-SCRIPTS = $(SCRIPTS_ALL) $(SCRIPTS_MORE1) $(SCRIPTS_MORE4) $(SCRIPTS_WIN32)
-
 SCRIPTS_BENCH = test_bench_regexp.res
 
 # Must run test1 first to create small.vim.
-$(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS_WIN32) $(NEW_TESTS_RES): $(SCRIPTS_FIRST)
+$(NEW_TESTS_RES): $(SCRIPTS_FIRST)
 
 .SUFFIXES: .in .out .res .vim
 
-vimall:	fixff $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS_WIN32) newtests
+vimall:	fixff $(SCRIPTS_FIRST) newtests
 	@echo ALL DONE
 
-nongui:	fixff nolog $(SCRIPTS_FIRST) $(SCRIPTS) newtests
+nongui:	fixff nolog $(SCRIPTS_FIRST) newtests
 	@echo ALL DONE
 
 benchmark: $(SCRIPTS_BENCH)
@@ -48,10 +46,10 @@
 small: nolog
 	@echo ALL DONE
 
-gui:	fixff nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) newtests
+gui:	fixff nolog $(SCRIPTS_FIRST) newtests
 	@echo ALL DONE
 
-win32:	fixff nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_WIN32) newtests
+win32:	fixff nolog $(SCRIPTS_FIRST) newtests
 	@echo ALL DONE
 
 # TODO: find a way to avoid changing the distributed files.
@@ -88,19 +86,6 @@
 	-@if exist test.out $(DEL) test.out
 	-@if exist viminfo  $(DEL) viminfo
 
-.in.out:
-	-@if exist $*.ok $(CP) $*.ok test.ok
-	$(VIMPROG) -u dos.vim $(NO_INITS) -s dotest.in $*.in
-	@diff test.out $*.ok
-	-@if exist $*.out $(DEL) $*.out
-	@$(MV) test.out $*.out
-	-@if exist Xdir1 $(DELDIR) Xdir1
-	-@if exist Xfind $(DELDIR) Xfind
-	-@if exist XfakeHOME $(DELDIR) XfakeHOME
-	-@if exist X* $(DEL) X*
-	-@if exist test.ok $(DEL) test.ok
-	-@if exist viminfo $(DEL) viminfo
-
 nolog:
 	-@if exist test.log $(DEL) test.log
 	-@if exist messages $(DEL) messages
diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms
index 59da981..f36ae6e 100644
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -27,26 +27,6 @@
 # Uncomment if you want tests in GUI mode.  Terminal mode is default.
 # WANT_GUI  = YES
 
-# Comment out if you want to run Unix specific tests as well, but please
-# be aware, that on OpenVMS will fail, because of cat, rm, etc commands
-# and directory handling.
-# WANT_UNIX = YES
-
-# Comment out if you have gzip on your system
-# HAVE_GZIP = YES
-
-# Comment out if you have GNU compatible diff on your system
-# HAVE_GDIFF = YES
-
-# Comment out if you have ICONV support
-# HAVE_ICONV = YES
-
-# Comment out if you have LUA support
-# HAVE_LUA = YES
-
-# Comment out if you have PYTHON support
-# HAVE_PYTHON = YES
-
 #######################################################################
 # End of configuration section.
 #
@@ -57,16 +37,12 @@
 
 .SUFFIXES : .out .in
 
-SCRIPT = test1.out test49.out test77a.out
+SCRIPT = test1.out test77a.out
 
 .IFDEF WANT_GUI
 GUI_OPTION = -g
 .ENDIF
 
-.IFDEF WANT_UNIX
-SCRIPT_UNIX = test49.out
-.ENDIF
-
 .in.out :
 	-@ !clean up before doing the test
 	-@ if "''F$SEARCH("test.out.*")'" .NES. "" then delete/noconfirm/nolog test.out.*
@@ -87,7 +63,7 @@
 	-@ if "''F$SEARCH("Xdotest.*")'"  .NES. "" then delete/noconfirm/nolog Xdotest.*.*
 	-@ if "''F$SEARCH("Xtest.*")'"    .NES. "" then delete/noconfirm/nolog Xtest.*.*
 
-all : clean nolog $(START_WITH) $(SCRIPT) $(SCRIPT_UNIX) nolog
+all : clean nolog $(START_WITH) $(SCRIPT) nolog
 	-@ write sys$output " "
 	-@ write sys$output "-----------------------------------------------"
 	-@ write sys$output "                All done"
@@ -111,12 +87,6 @@
 	-@ write sys$output "-----------------------------------------------"
 	-@ write sys$output "MAKE_VMS.MMS options:"
 	-@ write sys$output "   WANT_GUI   = ""$(WANT_GUI)"" "
-	-@ write sys$output "   WANT_UNIX  = ""$(WANT_UNIX)"" "
-	-@ write sys$output "   HAVE_GZIP  = ""$(HAVE_GZIP)"" "
-	-@ write sys$output "   HAVE_GDIFF = ""$(HAVE_GDIFF)"" "
-	-@ write sys$output "   HAVE_ICONV = ""$(HAVE_ICONV)"" "
-	-@ write sys$output "   HAVE_LUA   = ""$(HAVE_LUA)"" "
-	-@ write sys$output "   HAVE_PYTHON= ""$(HAVE_PYTHON)"" "
 	-@ write sys$output "Default vimrc file is VMS.VIM:"
 	-@ write sys$output "-----------------------------------------------"
 	-@ type VMS.VIM
diff --git a/src/testdir/Makefile b/src/testdir/Makefile
index 7f9ef04..0d51fde 100644
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -23,28 +23,19 @@
 default: nongui
 
 # The list of tests is common to all systems.
-# This defines NEW_TESTS, NEW_TESTS_RES, SCRIPTS_ALL, SCRIPTS_MORE* and
-# SCRIPTS_GUI.
+# This defines SCRIPTS_FIRST, NEW_TESTS and NEW_TESTS_RES
 include Make_all.mak
 
-
-SCRIPTS = $(SCRIPTS_ALL) \
-	  $(SCRIPTS_MORE1) \
-	  $(SCRIPTS_MORE2) \
-	  $(SCRIPTS_MORE4)
-
 # Explicit dependencies.
-test49.out: test49.vim
-
 test_options.res test_alot.res: opt_test.vim
 
 SCRIPTS_BENCH = test_bench_regexp.res
 
 .SUFFIXES: .in .out .res .vim
 
-nongui:	nolog $(SCRIPTS_FIRST) $(SCRIPTS) newtests report
+nongui:	nolog $(SCRIPTS_FIRST) newtests report
 
-gui:	nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) newtests report
+gui:	nolog $(SCRIPTS_FIRST) newtests report
 
 benchmark: $(SCRIPTS_BENCH)
 
@@ -63,10 +54,10 @@
 		else echo ALL DONE; \
 		fi"
 
-$(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) $(NEW_TESTS_RES): $(VIMPROG)
+$(SCRIPTS_FIRST) $(NEW_TESTS_RES): $(VIMPROG)
 
 # Must run test1 first to create small.vim.
-$(SCRIPTS) $(SCRIPTS_GUI) $(NEW_TESTS_RES): $(SCRIPTS_FIRST)
+$(NEW_TESTS_RES): $(SCRIPTS_FIRST)
 
 
 # Execute an individual new style test, e.g.:
@@ -116,37 +107,6 @@
 		echo; exit 1; fi"
 	-rm -rf X* viminfo
 
-.in.out:
-	-rm -rf $*.failed test.ok $(RM_ON_RUN)
-	cp $*.ok test.ok
-	# Sleep a moment to avoid that the xterm title is messed up.
-	# 200 msec is sufficient, but only modern sleep supports a fraction of
-	# a second, fall back to a second if it fails.
-	@-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1"
-	$(RUN_VIM) $*.in $(REDIR_TEST_TO_NULL)
-
-	# For flaky tests retry one time.  No tests at the moment.
-	#@/bin/sh -c "if test -f test.out -a $* = test61; then \
-	#	  if diff test.out $*.ok; \
-	#	  then echo flaky test ok first time; \
-	#	  else rm -rf $*.failed $(RM_ON_RUN); \
-	#		$(RUN_VIM) $*.in; \
-	#	  fi \
-	#	fi"
-
-	# Check if the test.out file matches test.ok.
-	@/bin/sh -c "if test -f test.out; then \
-		  if diff test.out $*.ok; \
-		  then mv -f test.out $*.out; \
-		  else echo $* FAILED >>test.log; mv -f test.out $*.failed; \
-		  fi \
-		else echo $* NO OUTPUT >>test.log; \
-		fi"
-	@/bin/sh -c "if test -f valgrind; then\
-		  mv -f valgrind valgrind.$*; \
-		fi"
-	-rm -rf X* test.ok viminfo
-
 nolog:
 	-rm -f test.log messages
 
diff --git a/src/testdir/README.txt b/src/testdir/README.txt
index d639146..8bfe475 100644
--- a/src/testdir/README.txt
+++ b/src/testdir/README.txt
@@ -4,14 +4,6 @@
 If it makes sense, add a new test method to an already existing file.  You may
 want to separate it from other tests with comment lines.
 
-The numbered tests are older, we have switched to named tests.  Don't add any
-more numbered tests.
-
-And then you can choose between a new style test, which is a Vim script, or an
-old style test, which uses Normal mode commands.  Use a new style test if you
-can.  Use an old style test when it needs to run without the +eval feature.
-
-
 TO ADD A NEW STYLE TEST:
 
 1) Create a test_<subject>.vim file.
@@ -57,16 +49,3 @@
 Mostly the same as writing a new style test.  Additionally, see help on
 "terminal-dumptest".  Put the reference dump in "dumps/Test_func_name.dump".
 
-
-TO ADD AN OLD STYLE TEST:
-
-1) Create test_<subject>.in and test_<subject>.ok files.
-2) Add test_<subject>.out to SCRIPTS_ALL in Make_all.mak in alphabetical order.
-3) Use make test_<subject>.out to run a single test in src/testdir/.
-   Use make test_<subject> to run a single test in src/.
-4) Also add an entry in src/Makefile.
-
-Keep in mind that the files are used as if everything was typed:
-- To add comments use:   :"  (that's an Ex command comment)
-- A line break is like pressing Enter.  If that happens on the last line
-  you'll hear a beep!
diff --git a/src/testdir/test49.in b/src/testdir/test49.in
deleted file mode 100644
index 79f13f6..0000000
--- a/src/testdir/test49.in
+++ /dev/null
@@ -1,32 +0,0 @@
-This is a test of the script language.
-
-If after adding a new test, the test output doesn't appear properly in
-test49.failed, try to add one or more "G"s at the line ending in "test.out"
-
-STARTTEST
-:so small.vim
-:se nocp nomore viminfo+=nviminfo
-:lang mess C
-:so test49.vim
-:" Go back to this file and append the results from register r.
-:buf test49.in
-G"rp:/^Results/,$w! test.out
-:"
-:" make valgrind happy
-:redir => funclist
-:silent func
-:redir END
-:for line in split(funclist, "\n")
-:  let name = matchstr(line, 'function \zs[A-Z]\w*\ze(')
-:  if name != ''
-:    exe "delfunc " . name
-:  endif
-:endfor
-:for v in keys(g:)
-:  silent! exe "unlet " . v
-:endfor
-:unlet v
-:qa!
-ENDTEST
-
-Results of test49.vim:
diff --git a/src/testdir/test49.ok b/src/testdir/test49.ok
deleted file mode 100644
index d687f5b..0000000
--- a/src/testdir/test49.ok
+++ /dev/null
@@ -1,12 +0,0 @@
-Results of test49.vim:
-*** Test  82: OK (8454401)
-*** Test  83: OK (2835)
-*** Test  84: OK (934782101)
-*** Test  85: OK (198689)
---- Test  86: No Crash for vimgrep on BufUnload
-*** Test  86: OK (0)
---- Test  88: All tests were run with throwing exceptions on error.
-	      The $VIMNOERRTHROW control is not configured.
---- Test  88: All tests were run with throwing exceptions on interrupt.
-	      The $VIMNOINTTHROW control is not configured.
-*** Test  88: OK (50443995)
diff --git a/src/testdir/test49.vim b/src/testdir/test49.vim
deleted file mode 100644
index bc3cfc8..0000000
--- a/src/testdir/test49.vim
+++ /dev/null
@@ -1,1454 +0,0 @@
-" Vim script language tests
-" Author:	Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com>
-" Last Change:	2020 Jun 07
-
-"-------------------------------------------------------------------------------
-" Test environment							    {{{1
-"-------------------------------------------------------------------------------
-
-
-" Adding new tests easily.						    {{{2
-"
-" Writing new tests is eased considerably with the following functions and
-" abbreviations (see "Commands for recording the execution path", "Automatic
-" argument generation").
-"
-" To get the abbreviations, execute the command
-"
-"    :let test49_set_env = 1 | source test49.vim
-"
-" To get them always (from src/testdir), put a line
-"
-"    au! BufRead test49.vim let test49_set_env = 1 | source test49.vim
-"
-" into the local .vimrc file in the src/testdir directory.
-"
-if exists("test49_set_env") && test49_set_env
-
-    " Automatic argument generation for the test environment commands.
-
-    function! Xsum()
-	let addend = substitute(getline("."), '^.*"\s*X:\s*\|^.*', '', "")
-	" Evaluate arithmetic expression.
-	if addend != ""
-	    exec "let g:Xsum = g:Xsum + " . addend
-	endif
-    endfunction
-
-    function! Xcheck()
-	let g:Xsum=0
-	?XpathINIT?,.call Xsum()
-	exec "norm A "
-	return g:Xsum
-    endfunction
-
-    iab Xcheck Xcheck<Space><C-R>=Xcheck()<CR><C-O>x
-
-    function! Xcomment(num)
-	let str = ""
-	let tabwidth = &sts ? &sts : &ts
-	let tabs = (48+tabwidth - a:num - virtcol(".")) / tabwidth
-	while tabs > 0
-	    let str = str . "\t"
-	    let tabs = tabs - 1
-	endwhile
-	let str = str . '" X:'
-	return str
-    endfunction
-
-    function! Xloop()
-	let back = line(".") . "|norm" . virtcol(".") . "|"
-	norm 0
-	let last = search('X\(loop\|path\)INIT\|Xloop\>', "bW")
-	exec back
-	let theline = getline(last)
-	if theline =~ 'X\(loop\|path\)INIT'
-	    let num = 1
-	else
-	    let num = 2 * substitute(theline, '.*Xloop\s*\(\d\+\).*', '\1', "")
-	endif
-	?X\(loop\|path\)INIT?
-	    \s/\(XloopINIT!\=\s*\d\+\s\+\)\@<=\(\d\+\)/\=2*submatch(2)/
-	exec back
-	exec "norm a "
-	return num . Xcomment(strlen(num))
-    endfunction
-
-    iab Xloop Xloop<Space><C-R>=Xloop()<CR><C-O>x
-
-    function! Xpath(loopinit)
-	let back = line(".") . "|norm" . virtcol(".") . "|"
-	norm 0
-	let last = search('XpathINIT\|Xpath\>\|XloopINIT', "bW")
-	exec back
-	let theline = getline(last)
-	if theline =~ 'XpathINIT'
-	    let num = 1
-	elseif theline =~ 'Xpath\>'
-	    let num = 2 * substitute(theline, '.*Xpath\s*\(\d\+\).*', '\1', "")
-	else
-	    let pattern = '.*XloopINIT!\=\s*\(\d\+\)\s*\(\d\+\).*'
-	    let num = substitute(theline, pattern, '\1', "")
-	    let factor = substitute(theline, pattern, '\2', "")
-	    " The "<C-O>x" from the "Xpath" iab and the character triggering its
-	    " expansion are in the input buffer.  Save and clear typeahead so
-	    " that it is not read away by the call to "input()" below.  Restore
-	    " afterwards.
-	    call inputsave()
-	    let loops = input("Number of iterations in previous loop? ")
-	    call inputrestore()
-	    while (loops > 0)
-		let num = num * factor
-		let loops = loops - 1
-	    endwhile
-	endif
-	exec "norm a "
-	if a:loopinit
-	    return num . " 1"
-	endif
-	return num . Xcomment(strlen(num))
-    endfunction
-
-    iab Xpath Xpath<Space><C-R>=Xpath(0)<CR><C-O>x
-    iab XloopINIT XloopINIT<Space><C-R>=Xpath(1)<CR><C-O>x
-
-    " Also useful (see ExtraVim below):
-    aug ExtraVim
-	au!
-	au  BufEnter <sfile> syn region ExtraVim
-		    \ start=+^if\s\+ExtraVim(.*)+ end=+^endif+
-		    \ transparent keepend
-	au  BufEnter <sfile> syn match ExtraComment /^"/
-		    \ contained containedin=ExtraVim
-	au  BufEnter <sfile> hi link ExtraComment vimComment
-    aug END
-
-    aug Xpath
-	au  BufEnter <sfile> syn keyword Xpath
-		    \ XpathINIT Xpath XloopINIT Xloop XloopNEXT Xcheck Xout
-	au  BufEnter <sfile> hi link Xpath Special
-    aug END
-
-    do BufEnter <sfile>
-
-    " Do not execute the tests when sourcing this file for getting the functions
-    " and abbreviations above, which are intended for easily adding new test
-    " cases; they are not needed for test execution.  Unlet the variable
-    " controlling this so that an explicit ":source" command for this file will
-    " execute the tests.
-    unlet test49_set_env
-    finish
-
-endif
-
-
-" Commands for recording the execution path.				    {{{2
-"
-" The Xpath/Xloop commands can be used for computing the eXecution path by
-" adding (different) powers of 2 from those script lines, for which the
-" execution should be checked.  Xloop provides different addends for each
-" execution of a loop.  Permitted values are 2^0 to 2^30, so that 31 execution
-" points (multiply counted inside loops) can be tested.
-"
-" Note that the arguments of the following commands can be generated
-" automatically, see below.
-"
-" Usage:								    {{{3
-"
-"   - Use XpathINIT at the beginning of the test.
-"
-"   - Use Xpath to check if a line is executed.
-"     Argument: power of 2 (decimal).
-"
-"   - To check multiple execution of loops use Xloop for automatically
-"     computing Xpath values:
-"
-"	- Use XloopINIT before the loop.
-"	  Two arguments:
-"		- the first Xpath value (power of 2) to be used (Xnext),
-"		- factor for computing a new Xnext value when reexecuting a loop
-"		  (by a ":continue" or ":endwhile"); this should be 2^n where
-"		  n is the number of Xloop commands inside the loop.
-"	  If XloopINIT! is used, the first execution of XloopNEXT is
-"	  a no-operation.
-"
-"       - Use Xloop inside the loop:
-"	  One argument:
-"		The argument and the Xnext value are multiplied to build the
-"		next Xpath value.  No new Xnext value is prepared.  The argument
-"		should be 2^(n-1) for the nth Xloop command inside the loop.
-"		If the loop has only one Xloop command, the argument can be
-"		omitted (default: 1).
-"
-"	- Use XloopNEXT before ":continue" and ":endwhile".  This computes a new
-"	  Xnext value for the next execution of the loop by multiplying the old
-"	  one with the factor specified in the XloopINIT command.  No Argument.
-"	  Alternatively, when XloopINIT! is used, a single XloopNEXT at the
-"	  beginning of the loop can be used.
-"
-"     Nested loops are not supported.
-"
-"   - Use Xcheck at end of each test.  It prints the test number, the expected
-"     execution path value, the test result ("OK" or "FAIL"), and, if the tests
-"     fails, the actual execution path.
-"     One argument:
-"	    Expected Xpath/Xloop sum for the correct execution path.
-"	    In order that this value can be computed automatically, do the
-"	    following: For each line in the test with an Xpath and Xloop
-"	    command, add a comment starting with "X:" and specifying an
-"	    expression that evaluates to the value contributed by this line to
-"	    the correct execution path.  (For copying an Xpath argument of at
-"	    least two digits into the comment, press <C-P>.)  At the end of the
-"	    test, just type "Xcheck" and press <Esc>.
-"
-"   - In order to add additional information to the test output file, use the
-"     Xout command.  Argument(s) like ":echo".
-"
-" Automatic argument generation:					    {{{3
-"
-"   The arguments of the Xpath, XloopINIT, Xloop, and Xcheck commands can be
-"   generated automatically, so that new tests can easily be written without
-"   mental arithmetic.  The Xcheck argument is computed from the "X:" comments
-"   of the preceding Xpath and Xloop commands.  See the commands and
-"   abbreviations at the beginning of this file.
-"
-" Implementation:							    {{{3
-"     XpathINIT, Xpath, XloopINIT, Xloop, XloopNEXT, Xcheck, Xout.
-"
-" The variants for existing g:ExtraVimResult are needed when executing a script
-" in an extra Vim process, see ExtraVim below.
-
-" EXTRA_VIM_START - do not change or remove this line.
-
-com!		    XpathINIT	let g:Xpath = 0
-
-if exists("g:ExtraVimResult")
-    com! -count -bar    Xpath	exec "!echo <count> >>" . g:ExtraVimResult
-else
-    com! -count -bar    Xpath	let g:Xpath = g:Xpath + <count>
-endif
-
-com! -count -nargs=1 -bang
-		  \ XloopINIT	let g:Xnext = <count> |
-				    \ let g:Xfactor = <args> |
-				    \ let g:Xskip = strlen("<bang>")
-
-if exists("g:ExtraVimResult")
-    com! -count=1 -bar  Xloop	exec "!echo " . (g:Xnext * <count>) . " >>" .
-				    \ g:ExtraVimResult
-else
-    com! -count=1 -bar  Xloop	let g:Xpath = g:Xpath + g:Xnext * <count>
-endif
-
-com!		    XloopNEXT	let g:Xnext = g:Xnext *
-				    \ (g:Xskip ? 1 : g:Xfactor) |
-				    \ let g:Xskip = 0
-
-let @r = ""
-let Xtest = 1
-com! -count	    Xcheck	let Xresult = "*** Test " .
-				    \ (Xtest<10?"  ":Xtest<100?" ":"") .
-				    \ Xtest . ": " . (
-				    \ (Xpath==<count>) ? "OK (".Xpath.")" :
-					\ "FAIL (".Xpath." instead of <count>)"
-				    \ ) |
-				    \ let @R = Xresult . "\n" |
-				    \ echo Xresult |
-				    \ let Xtest = Xtest + 1
-
-if exists("g:ExtraVimResult")
-    com! -nargs=+    Xoutq	exec "!echo @R:'" .
-				    \ substitute(substitute(<q-args>,
-				    \ "'", '&\\&&', "g"), "\n", "@NL@", "g")
-				    \ . "' >>" . g:ExtraVimResult
-else
-    com! -nargs=+    Xoutq	let @R = "--- Test " .
-				    \ (g:Xtest<10?"  ":g:Xtest<100?" ":"") .
-				    \ g:Xtest . ": " . substitute(<q-args>,
-				    \ "\n", "&\t      ", "g") . "\n"
-endif
-com! -nargs=+	    Xout	exec 'Xoutq' <args>
-
-" Switch off storing of lines for undoing changes.  Speeds things up a little.
-set undolevels=-1
-
-" EXTRA_VIM_STOP - do not change or remove this line.
-
-
-" ExtraVim() - Run a script file in an extra Vim process.		    {{{2
-"
-" This is useful for testing immediate abortion of the script processing due to
-" an error in a command dynamically enclosed by a :try/:tryend region or when an
-" exception is thrown but not caught or when an interrupt occurs.  It can also
-" be used for testing :finish.
-"
-" An interrupt location can be specified by an "INTERRUPT" comment.  A number
-" telling how often this location is reached (in a loop or in several function
-" calls) should be specified as argument.  When missing, once per script
-" invocation or function call is assumed.  INTERRUPT locations are tested by
-" setting a breakpoint in that line and using the ">quit" debug command when
-" the breakpoint is reached.  A function for which an INTERRUPT location is
-" specified must be defined before calling it (or executing it as a script by
-" using ExecAsScript below).
-"
-" This function is only called in normal modus ("g:ExtraVimResult" undefined).
-"
-" Tests to be executed as an extra script should be written as follows:
-"
-"	column 1			column 1
-"	|				|
-"	v				v
-"
-"	XpathINIT			XpathINIT
-"	if ExtraVim()			if ExtraVim()
-"	    ...				"   ...
-"	    ...				"   ...
-"	endif				endif
-"	Xcheck <number>			Xcheck <number>
-"
-" Double quotes in column 1 are removed before the script is executed.
-" They should be used if the test has unbalanced conditionals (:if/:endif,
-" :while:/endwhile, :try/:endtry) or for a line with a syntax error.  The
-" extra script may use Xpath, XloopINIT, Xloop, XloopNEXT, and Xout as usual.
-"
-" A file name may be specified as argument.  All messages of the extra Vim
-" process are then redirected to the file.  An existing file is overwritten.
-"
-let ExtraVimCount = 0
-let ExtraVimBase = expand("<sfile>")
-let ExtraVimTestEnv = ""
-"
-function ExtraVim(...)
-    " Count how often this function is called.
-    let g:ExtraVimCount = g:ExtraVimCount + 1
-
-    " Disable folds to prevent that the ranges in the ":write" commands below
-    " are extended up to the end of a closed fold.  This also speeds things up
-    " considerably.
-    set nofoldenable
-
-    " Open a buffer for this test script and copy the test environment to
-    " a temporary file.  Take account of parts relevant for the extra script
-    " execution only.
-    let current_buffnr = bufnr("%")
-    execute "view +1" g:ExtraVimBase
-    if g:ExtraVimCount == 1
-	let g:ExtraVimTestEnv = tempname()
-	execute "/E" . "XTRA_VIM_START/+,/E" . "XTRA_VIM_STOP/-w"
-		    \ g:ExtraVimTestEnv "|']+"
-	execute "/E" . "XTRA_VIM_START/+,/E" . "XTRA_VIM_STOP/-w >>"
-		    \ g:ExtraVimTestEnv "|']+"
-	execute "/E" . "XTRA_VIM_START/+,/E" . "XTRA_VIM_STOP/-w >>"
-		    \ g:ExtraVimTestEnv "|']+"
-	execute "/E" . "XTRA_VIM_START/+,/E" . "XTRA_VIM_STOP/-w >>"
-		    \ g:ExtraVimTestEnv "|']+"
-    endif
-
-    " Start the extra Vim script with a ":source" command for the test
-    " environment.  The source line number where the extra script will be
-    " appended, needs to be passed as variable "ExtraVimBegin" to the script.
-    let extra_script = tempname()
-    exec "!echo 'source " . g:ExtraVimTestEnv . "' >" . extra_script
-    let extra_begin = 1
-
-    " Starting behind the test environment, skip over the first g:ExtraVimCount
-    " occurrences of "if ExtraVim()" and copy the following lines up to the
-    " matching "endif" to the extra Vim script.
-    execute "/E" . "ND_OF_TEST_ENVIRONMENT/"
-    exec 'norm ' . g:ExtraVimCount . '/^\s*if\s\+ExtraVim(.*)/+' . "\n"
-    execute ".,/^endif/-write >>" . extra_script
-
-    " Open a buffer for the extra Vim script, delete all ^", and write the
-    " script if was actually modified.
-    execute "edit +" . (extra_begin + 1) extra_script
-    ,$s/^"//e
-    update
-
-    " Count the INTERRUPTs and build the breakpoint and quit commands.
-    let breakpoints = ""
-    let debug_quits = ""
-    let in_func = 0
-    exec extra_begin
-    while search(
-	    \ '"\s*INTERRUPT\h\@!\|^\s*fu\%[nction]\>!\=\s*\%(\u\|s:\)\w*\s*(\|'
-	    \ . '^\s*\\\|^\s*endf\%[unction]\>\|'
-	    \ . '\%(^\s*fu\%[nction]!\=\s*\)\@<!\%(\u\|s:\)\w*\s*(\|'
-	    \ . 'ExecAsScript\s\+\%(\u\|s:\)\w*',
-	    \ "W") > 0
-	let theline = getline(".")
-	if theline =~ '^\s*fu'
-	    " Function definition.
-	    let in_func = 1
-	    let func_start = line(".")
-	    let func_name = substitute(theline,
-		\ '^\s*fu\%[nction]!\=\s*\(\%(\u\|s:\)\w*\).*', '\1', "")
-	elseif theline =~ '^\s*endf'
-	    " End of function definition.
-	    let in_func = 0
-	else
-	    let finding = substitute(theline, '.*\(\%' . col(".") . 'c.*\)',
-		\ '\1', "")
-	    if finding =~ '^"\s*INTERRUPT\h\@!'
-		" Interrupt comment.  Compose as many quit commands as
-		" specified.
-		let cnt = substitute(finding,
-		    \ '^"\s*INTERRUPT\s*\(\d*\).*$', '\1', "")
-		let quits = ""
-		while cnt > 0
-		    " Use "\r" rather than "\n" to separate the quit commands.
-		    " "\r" is not interpreted as command separator by the ":!"
-		    " command below but works to separate commands in the
-		    " external vim.
-		    let quits = quits . "q\r"
-		    let cnt = cnt - 1
-		endwhile
-		if in_func
-		    " Add the function breakpoint and note the number of quits
-		    " to be used, if specified, or one for every call else.
-		    let breakpoints = breakpoints . " -c 'breakadd func " .
-			\ (line(".") - func_start) . " " .
-			\ func_name . "'"
-		    if quits != ""
-			let debug_quits = debug_quits . quits
-		    elseif !exists("quits{func_name}")
-			let quits{func_name} = "q\r"
-		    else
-			let quits{func_name} = quits{func_name} . "q\r"
-		    endif
-		else
-		    " Add the file breakpoint and the quits to be used for it.
-		    let breakpoints = breakpoints . " -c 'breakadd file " .
-			\ line(".") . " " . extra_script . "'"
-		    if quits == ""
-			let quits = "q\r"
-		    endif
-		    let debug_quits = debug_quits . quits
-		endif
-	    else
-		" Add the quits to be used for calling the function or executing
-		" it as script file.
-		if finding =~ '^ExecAsScript'
-		    " Sourcing function as script.
-		    let finding = substitute(finding,
-			\ '^ExecAsScript\s\+\(\%(\u\|s:\)\w*\).*', '\1', "")
-		else
-		    " Function call.
-		    let finding = substitute(finding,
-			\ '^\(\%(\u\|s:\)\w*\).*', '\1', "")
-		endif
-		if exists("quits{finding}")
-		    let debug_quits = debug_quits . quits{finding}
-		endif
-	    endif
-	endif
-    endwhile
-
-    " Close the buffer for the script and create an (empty) resultfile.
-    bwipeout
-    let resultfile = tempname()
-    exec "!>" . resultfile
-
-    " Run the script in an extra vim.  Switch to extra modus by passing the
-    " resultfile in ExtraVimResult.  Redirect messages to the file specified as
-    " argument if any.  Use ":debuggreedy" so that the commands provided on the
-    " pipe are consumed at the debug prompt.  Use "-N" to enable command-line
-    " continuation ("C" in 'cpo').  Add "nviminfo" to 'viminfo' to avoid
-    " messing up the user's viminfo file.
-    let redirect = a:0 ?
-	\ " -c 'au VimLeave * redir END' -c 'redir\\! >" . a:1 . "'" : ""
-    exec "!echo '" . debug_quits . "q' | " .. v:progpath .. " -u NONE -N -Xes" . redirect .
-	\ " -c 'debuggreedy|set viminfo+=nviminfo'" .
-	\ " -c 'let ExtraVimBegin = " . extra_begin . "'" .
-	\ " -c 'let ExtraVimResult = \"" . resultfile . "\"'" . breakpoints .
-	\ " -S " . extra_script
-
-    " Build the resulting sum for resultfile and add it to g:Xpath.  Add Xout
-    " information provided by the extra Vim process to the test output.
-    let sum = 0
-    exec "edit" resultfile
-    let line = 1
-    while line <= line("$")
-	let theline = getline(line)
-	if theline =~ '^@R:'
-	    exec 'Xout "' . substitute(substitute(
-		\ escape(escape(theline, '"'), '\"'),
-		\ '^@R:', '', ""), '@NL@', "\n", "g") . '"'
-	else
-	    let sum = sum + getline(line)
-	endif
-	let line = line + 1
-    endwhile
-    bwipeout
-    let g:Xpath = g:Xpath + sum
-
-    " Delete the extra script and the resultfile.
-    call delete(extra_script)
-    call delete(resultfile)
-
-    " Switch back to the buffer that was active when this function was entered.
-    exec "buffer" current_buffnr
-
-    " Return 0.  This protects extra scripts from being run in the main Vim
-    " process.
-    return 0
-endfunction
-
-
-" ExtraVimThrowpoint() - Relative throwpoint in ExtraVim script		    {{{2
-"
-" Evaluates v:throwpoint and returns the throwpoint relative to the beginning of
-" an ExtraVim script as passed by ExtraVim() in ExtraVimBegin.
-"
-" EXTRA_VIM_START - do not change or remove this line.
-function ExtraVimThrowpoint()
-    if !exists("g:ExtraVimBegin")
-	Xout "ExtraVimThrowpoint() used outside ExtraVim() script."
-	return v:throwpoint
-    endif
-
-    if v:throwpoint =~ '^function\>'
-	return v:throwpoint
-    endif
-
-    return "line " .
-	\ (substitute(v:throwpoint, '.*, line ', '', "") - g:ExtraVimBegin) .
-	\ " of ExtraVim() script"
-endfunction
-" EXTRA_VIM_STOP - do not change or remove this line.
-
-
-" MakeScript() - Make a script file from a function.			    {{{2
-"
-" Create a script that consists of the body of the function a:funcname.
-" Replace any ":return" by a ":finish", any argument variable by a global
-" variable, and every ":call" by a ":source" for the next following argument
-" in the variable argument list.  This function is useful if similar tests are
-" to be made for a ":return" from a function call or a ":finish" in a script
-" file.
-"
-" In order to execute a function specifying an INTERRUPT location (see ExtraVim)
-" as a script file, use ExecAsScript below.
-"
-" EXTRA_VIM_START - do not change or remove this line.
-function MakeScript(funcname, ...)
-    let script = tempname()
-    execute "redir! >" . script
-    execute "function" a:funcname
-    redir END
-    execute "edit" script
-    " Delete the "function" and the "endfunction" lines.  Do not include the
-    " word "function" in the pattern since it might be translated if LANG is
-    " set.  When MakeScript() is being debugged, this deletes also the debugging
-    " output of its line 3 and 4.
-    exec '1,/.*' . a:funcname . '(.*)/d'
-    /^\d*\s*endfunction\>/,$d
-    %s/^\d*//e
-    %s/return/finish/e
-    %s/\<a:\(\h\w*\)/g:\1/ge
-    normal gg0
-    let cnt = 0
-    while search('\<call\s*\%(\u\|s:\)\w*\s*(.*)', 'W') > 0
-	let cnt = cnt + 1
-	s/\<call\s*\%(\u\|s:\)\w*\s*(.*)/\='source ' . a:{cnt}/
-    endwhile
-    g/^\s*$/d
-    write
-    bwipeout
-    return script
-endfunction
-" EXTRA_VIM_STOP - do not change or remove this line.
-
-
-" ExecAsScript - Source a temporary script made from a function.	    {{{2
-"
-" Make a temporary script file from the function a:funcname, ":source" it, and
-" delete it afterwards.
-"
-" When inside ":if ExtraVim()", add a file breakpoint for each INTERRUPT
-" location specified in the function.
-"
-" EXTRA_VIM_START - do not change or remove this line.
-function ExecAsScript(funcname)
-    " Make a script from the function passed as argument.
-    let script = MakeScript(a:funcname)
-
-    " When running in an extra Vim process, add a file breakpoint for each
-    " function breakpoint set when the extra Vim process was invoked by
-    " ExtraVim().
-    if exists("g:ExtraVimResult")
-	let bplist = tempname()
-	execute "redir! >" . bplist
-	breaklist
-	redir END
-	execute "edit" bplist
-	" Get the line number from the function breakpoint.  Works also when
-	" LANG is set.
-	execute 'v/^\s*\d\+\s\+func\s\+' . a:funcname . '\s.*/d'
-	%s/^\s*\d\+\s\+func\s\+\%(\u\|s:\)\w*\s\D*\(\d*\).*/\1/e
-	let cnt = 0
-	while cnt < line("$")
-	    let cnt = cnt + 1
-	    if getline(cnt) != ""
-		execute "breakadd file" getline(cnt) script
-	    endif
-	endwhile
-	bwipeout!
-	call delete(bplist)
-    endif
-
-    " Source and delete the script.
-    exec "source" script
-    call delete(script)
-endfunction
-
-com! -nargs=1 -bar ExecAsScript call ExecAsScript(<f-args>)
-" EXTRA_VIM_STOP - do not change or remove this line.
-
-
-" END_OF_TEST_ENVIRONMENT - do not change or remove this line.
-
-function! MESSAGES(...)
-    try
-	exec "edit" g:msgfile
-    catch /^Vim(edit):/
-	return 0
-    endtry
-
-    let english = v:lang == "C" || v:lang =~ '^[Ee]n'
-    let match = 1
-    norm gg
-
-    let num = a:0 / 2
-    let cnt = 1
-    while cnt <= num
-	let enr = a:{2*cnt - 1}
-	let emsg= a:{2*cnt}
-	let cnt = cnt + 1
-
-	if enr == ""
-	    Xout "TODO: Add message number for:" emsg
-	elseif enr == "INT"
-	    let enr = ""
-	endif
-	if enr == "" && !english
-	    continue
-	endif
-	let pattern = (enr != "") ? enr . ':.*' : ''
-	if english
-	    let pattern = pattern . emsg
-	endif
-	if !search(pattern, "W")
-	    let match = 0
-	    Xout "No match for:" pattern
-	endif
-	norm $
-    endwhile
-
-    bwipeout!
-    return match
-endfunction
-
-" Following tests were moved to test_vimscript.vim:
-"     1-24, 27-31, 34-40, 49-50, 52-68, 76-81, 87
-" Following tests were moved to test_trycatch.vim:
-"     25-26, 32-33, 41-48, 51, 69-75
-let Xtest = 82
-
-"-------------------------------------------------------------------------------
-" Test 82:  Ignoring :catch clauses after an error or interrupt		    {{{1
-"
-"	    When an exception is thrown and an error or interrupt occurs before
-"	    the matching :catch clause is reached, the exception is discarded
-"	    and the :catch clause is ignored (also for the error or interrupt
-"	    exception being thrown then).
-"-------------------------------------------------------------------------------
-
-XpathINIT
-
-if ExtraVim()
-    try
-	try
-	    Xpath 1				" X: 1
-	    throw "arrgh"
-	    Xpath 2				" X: 0
-"	    if 1
-		Xpath 4				" X: 0
-		" error after :throw: missing :endif
-	catch /.*/
-	    Xpath 8				" X: 0
-	    Xout v:exception "in" ExtraVimThrowpoint()
-	catch /.*/
-	    Xpath 16				" X: 0
-	    Xout v:exception "in" ExtraVimThrowpoint()
-	endtry
-	Xpath 32				" X: 0
-    catch /arrgh/
-	Xpath 64				" X: 0
-    endtry
-    Xpath 128					" X: 0
-endif
-
-if ExtraVim()
-    function! E()
-	try
-	    try
-		Xpath 256			" X: 256
-		throw "arrgh"
-		Xpath 512			" X: 0
-"		if 1
-		    Xpath 1024			" X: 0
-		    " error after :throw: missing :endif
-	    catch /.*/
-		Xpath 2048			" X: 0
-		Xout v:exception "in" ExtraVimThrowpoint()
-	    catch /.*/
-		Xpath 4096			" X: 0
-		Xout v:exception "in" ExtraVimThrowpoint()
-	    endtry
-	    Xpath 8192				" X: 0
-	catch /arrgh/
-	    Xpath 16384				" X: 0
-	endtry
-    endfunction
-
-    call E()
-    Xpath 32768					" X: 0
-endif
-
-if ExtraVim()
-    try
-	try
-	    Xpath 65536				" X: 65536
-	    throw "arrgh"
-	    Xpath 131072			" X: 0
-	catch /.*/	"INTERRUPT
-	    Xpath 262144			" X: 0
-	    Xout v:exception "in" ExtraVimThrowpoint()
-	catch /.*/
-	    Xpath 524288			" X: 0
-	    Xout v:exception "in" ExtraVimThrowpoint()
-	endtry
-	Xpath 1048576				" X: 0
-    catch /arrgh/
-	Xpath 2097152				" X: 0
-    endtry
-    Xpath 4194304				" X: 0
-endif
-
-if ExtraVim()
-    function I()
-	try
-	    try
-		Xpath 8388608			" X: 8388608
-		throw "arrgh"
-		Xpath 16777216			" X: 0
-	    catch /.*/	"INTERRUPT
-		Xpath 33554432			" X: 0
-		Xout v:exception "in" ExtraVimThrowpoint()
-	    catch /.*/
-		Xpath 67108864			" X: 0
-		Xout v:exception "in" ExtraVimThrowpoint()
-	    endtry
-	    Xpath 134217728			" X: 0
-	catch /arrgh/
-	    Xpath 268435456			" X: 0
-	endtry
-    endfunction
-
-    call I()
-    Xpath 536870912				" X: 0
-endif
-
-Xcheck 8454401
-
-
-"-------------------------------------------------------------------------------
-" Test 83:  Executing :finally clauses after an error or interrupt	    {{{1
-"
-"	    When an exception is thrown and an error or interrupt occurs before
-"	    the :finally of the innermost :try is reached, the exception is
-"	    discarded and the :finally clause is executed.
-"-------------------------------------------------------------------------------
-
-XpathINIT
-
-if ExtraVim()
-    try
-	Xpath 1					" X: 1
-	try
-	    Xpath 2				" X: 2
-	    throw "arrgh"
-	    Xpath 4				" X: 0
-"	    if 1
-		Xpath 8				" X: 0
-	    " error after :throw: missing :endif
-	finally
-	    Xpath 16				" X: 16
-	endtry
-	Xpath 32				" X: 0
-    catch /arrgh/
-	Xpath 64				" X: 0
-    endtry
-    Xpath 128					" X: 0
-endif
-
-if ExtraVim()
-    try
-	Xpath 256				" X: 256
-	try
-	    Xpath 512				" X: 512
-	    throw "arrgh"
-	    Xpath 1024				" X: 0
-	finally		"INTERRUPT
-	    Xpath 2048				" X: 2048
-	endtry
-	Xpath 4096				" X: 0
-    catch /arrgh/
-	Xpath 8192				" X: 0
-    endtry
-    Xpath 16384					" X: 0
-endif
-
-Xcheck 2835
-
-
-"-------------------------------------------------------------------------------
-" Test 84:  Exceptions in autocommand sequences.			    {{{1
-"
-"	    When an exception occurs in a sequence of autocommands for
-"	    a specific event, the rest of the sequence is not executed.  The
-"	    command that triggered the autocommand execution aborts, and the
-"	    exception is propagated to the caller.
-"
-"	    For the FuncUndefined event under a function call expression or
-"	    :call command, the function is not executed, even when it has
-"	    been defined by the autocommands before the exception occurred.
-"-------------------------------------------------------------------------------
-
-XpathINIT
-
-if ExtraVim()
-
-    function! INT()
-	"INTERRUPT
-	let dummy = 0
-    endfunction
-
-    aug TMP
-	autocmd!
-
-	autocmd User x1 Xpath 1			" X: 1
-	autocmd User x1 throw "x1"
-	autocmd User x1 Xpath 2			" X: 0
-
-	autocmd User x2 Xpath 4			" X: 4
-	autocmd User x2 asdf
-	autocmd User x2 Xpath 8			" X: 0
-
-	autocmd User x3 Xpath 16		" X: 16
-	autocmd User x3 call INT()
-	autocmd User x3 Xpath 32		" X: 0
-
-	autocmd FuncUndefined U1 function! U1()
-	autocmd FuncUndefined U1     Xpath 64	" X: 0
-	autocmd FuncUndefined U1 endfunction
-	autocmd FuncUndefined U1 Xpath 128	" X: 128
-	autocmd FuncUndefined U1 throw "U1"
-	autocmd FuncUndefined U1 Xpath 256	" X: 0
-
-	autocmd FuncUndefined U2 function! U2()
-	autocmd FuncUndefined U2     Xpath 512	" X: 0
-	autocmd FuncUndefined U2 endfunction
-	autocmd FuncUndefined U2 Xpath 1024	" X: 1024
-	autocmd FuncUndefined U2 ASDF
-	autocmd FuncUndefined U2 Xpath 2048	" X: 0
-
-	autocmd FuncUndefined U3 function! U3()
-	autocmd FuncUndefined U3     Xpath 4096	" X: 0
-	autocmd FuncUndefined U3 endfunction
-	autocmd FuncUndefined U3 Xpath 8192	" X: 8192
-	autocmd FuncUndefined U3 call INT()
-	autocmd FuncUndefined U3 Xpath 16384	" X: 0
-    aug END
-
-    try
-	try
-	    Xpath 32768				" X: 32768
-	    doautocmd User x1
-	catch /x1/
-	    Xpath 65536				" X: 65536
-	endtry
-
-	while 1
-	    try
-		Xpath 131072			" X: 131072
-		let caught = 0
-		doautocmd User x2
-	    catch /asdf/
-		let caught = 1
-	    finally
-		Xpath 262144			" X: 262144
-		if !caught && !$VIMNOERRTHROW
-		    Xpath 524288		" X: 0
-		    " Propagate uncaught error exception,
-		else
-		    " ... but break loop for caught error exception,
-		    " or discard error and break loop if $VIMNOERRTHROW
-		    break
-		endif
-	    endtry
-	endwhile
-
-	while 1
-	    try
-		Xpath 1048576			" X: 1048576
-		let caught = 0
-		doautocmd User x3
-	    catch /Vim:Interrupt/
-		let caught = 1
-	    finally
-		Xpath 2097152			" X: 2097152
-		if !caught && !$VIMNOINTTHROW
-		    Xpath 4194304		" X: 0
-		    " Propagate uncaught interrupt exception,
-		else
-		    " ... but break loop for caught interrupt exception,
-		    " or discard interrupt and break loop if $VIMNOINTTHROW
-		    break
-		endif
-	    endtry
-	endwhile
-
-	if exists("*U1") | delfunction U1 | endif
-	if exists("*U2") | delfunction U2 | endif
-	if exists("*U3") | delfunction U3 | endif
-
-	try
-	    Xpath 8388608			" X: 8388608
-	    call U1()
-	catch /U1/
-	    Xpath 16777216			" X: 16777216
-	endtry
-
-	while 1
-	    try
-		Xpath 33554432			" X: 33554432
-		let caught = 0
-		call U2()
-	    catch /ASDF/
-		let caught = 1
-	    finally
-		Xpath 67108864			" X: 67108864
-		if !caught && !$VIMNOERRTHROW
-		    Xpath 134217728		" X: 0
-		    " Propagate uncaught error exception,
-		else
-		    " ... but break loop for caught error exception,
-		    " or discard error and break loop if $VIMNOERRTHROW
-		    break
-		endif
-	    endtry
-	endwhile
-
-	while 1
-	    try
-		Xpath 268435456			" X: 268435456
-		let caught = 0
-		call U3()
-	    catch /Vim:Interrupt/
-		let caught = 1
-	    finally
-		Xpath 536870912			" X: 536870912
-		if !caught && !$VIMNOINTTHROW
-		    Xpath 1073741824		" X: 0
-		    " Propagate uncaught interrupt exception,
-		else
-		    " ... but break loop for caught interrupt exception,
-		    " or discard interrupt and break loop if $VIMNOINTTHROW
-		    break
-		endif
-	    endtry
-	endwhile
-    catch /.*/
-	" The Xpath command does not accept 2^31 (negative); display explicitly:
-	exec "!echo 2147483648 >>" . g:ExtraVimResult
-	Xout "Caught" v:exception "in" v:throwpoint
-    endtry
-
-    unlet caught
-    delfunction INT
-    delfunction U1
-    delfunction U2
-    delfunction U3
-    au! TMP
-    aug! TMP
-endif
-
-Xcheck 934782101
-
-
-"-------------------------------------------------------------------------------
-" Test 85:  Error exceptions in autocommands for I/O command events	    {{{1
-"
-"	    When an I/O command is inside :try/:endtry, autocommands to be
-"	    executed after it should be skipped on an error (exception) in the
-"	    command itself or in autocommands to be executed before the command.
-"	    In the latter case, the I/O command should not be executed either.
-"	    Example 1: BufWritePre, :write, BufWritePost
-"	    Example 2: FileReadPre, :read, FileReadPost.
-"-------------------------------------------------------------------------------
-
-XpathINIT
-
-function! MSG(enr, emsg)
-    let english = v:lang == "C" || v:lang =~ '^[Ee]n'
-    if a:enr == ""
-	Xout "TODO: Add message number for:" a:emsg
-	let v:errmsg = ":" . v:errmsg
-    endif
-    let match = 1
-    if v:errmsg !~ '^'.a:enr.':' || (english && v:errmsg !~ a:emsg)
-	let match = 0
-	if v:errmsg == ""
-	    Xout "Message missing."
-	else
-	    let v:errmsg = escape(v:errmsg, '"')
-	    Xout "Unexpected message:" v:errmsg
-	endif
-    endif
-    return match
-endfunction
-
-" Remove the autocommands for the events specified as arguments in all used
-" autogroups.
-function Delete_autocommands(...)
-    let augfile = tempname()
-    while 1
-	try
-	    exec "redir >" . augfile
-	    aug
-	    redir END
-	    exec "edit" augfile
-	    g/^$/d
-	    norm G$
-	    let wrap = "w"
-	    while search('\%(  \|^\)\@<=.\{-}\%(  \)\@=', wrap) > 0
-		let wrap = "W"
-		exec "norm y/  \n"
-		let argno = 1
-		while argno <= a:0
-		    exec "au!" escape(@", " ") a:{argno}
-		    let argno = argno + 1
-		endwhile
-	    endwhile
-	catch /.*/
-	finally
-	    bwipeout!
-	    call delete(augfile)
-	    break		" discard errors for $VIMNOERRTHROW
-	endtry
-    endwhile
-endfunction
-
-call Delete_autocommands("BufWritePre", "BufWritePost")
-
-while 1
-    try
-	try
-	    let post = 0
-	    aug TMP
-		au! BufWritePost * let post = 1
-	    aug END
-	    let caught = 0
-	    write /n/o/n/e/x/i/s/t/e/n/t
-	catch /^Vim(write):/
-	    let caught = 1
-	    let v:errmsg = substitute(v:exception, '^Vim(write):', '', "")
-	finally
-	    Xpath 1				" X: 1
-	    if !caught && !$VIMNOERRTHROW
-		Xpath 2				" X: 0
-	    endif
-	    let v:errmsg = substitute(v:errmsg, '^"/n/o/n/e/x/i/s/t/e/n/t" ',
-		\ '', "")
-	    if !MSG('E212', "Can't open file for writing")
-		Xpath 4				" X: 0
-	    endif
-	    if post
-		Xpath 8				" X: 0
-		Xout "BufWritePost commands executed after write error"
-	    endif
-	    au! TMP
-	    aug! TMP
-	endtry
-    catch /.*/
-	Xpath 16				" X: 0
-	Xout v:exception "in" v:throwpoint
-    finally
-	break		" discard error for $VIMNOERRTHROW
-    endtry
-endwhile
-
-while 1
-    try
-	try
-	    let post = 0
-	    aug TMP
-		au! BufWritePre  * asdf
-		au! BufWritePost * let post = 1
-	    aug END
-	    let tmpfile = tempname()
-	    let caught = 0
-	    exec "write" tmpfile
-	catch /^Vim\((write)\)\=:/
-	    let caught = 1
-	    let v:errmsg = substitute(v:exception, '^Vim\((write)\)\=:', '', "")
-	finally
-	    Xpath 32				" X: 32
-	    if !caught && !$VIMNOERRTHROW
-		Xpath 64			" X: 0
-	    endif
-	    let v:errmsg = substitute(v:errmsg, '^"'.tmpfile.'" ', '', "")
-	    if !MSG('E492', "Not an editor command")
-		Xpath 128			" X: 0
-	    endif
-	    if filereadable(tmpfile)
-		Xpath 256			" X: 0
-		Xout ":write command not suppressed after BufWritePre error"
-	    endif
-	    if post
-		Xpath 512			" X: 0
-		Xout "BufWritePost commands executed after BufWritePre error"
-	    endif
-	    au! TMP
-	    aug! TMP
-	endtry
-    catch /.*/
-	Xpath 1024				" X: 0
-	Xout v:exception "in" v:throwpoint
-    finally
-	break		" discard error for $VIMNOERRTHROW
-    endtry
-endwhile
-
-call delete(tmpfile)
-
-call Delete_autocommands("BufWritePre", "BufWritePost",
-    \ "BufReadPre", "BufReadPost", "FileReadPre", "FileReadPost")
-
-while 1
-    try
-	try
-	    let post = 0
-	    aug TMP
-		au! FileReadPost * let post = 1
-	    aug END
-	    let caught = 0
-	    read /n/o/n/e/x/i/s/t/e/n/t
-	catch /^Vim(read):/
-	    let caught = 1
-	    let v:errmsg = substitute(v:exception, '^Vim(read):', '', "")
-	finally
-	    Xpath 2048				" X: 2048
-	    if !caught && !$VIMNOERRTHROW
-		Xpath 4096			" X: 0
-	    endif
-	    let v:errmsg = substitute(v:errmsg, ' /n/o/n/e/x/i/s/t/e/n/t$',
-		\ '', "")
-	    if !MSG('E484', "Can't open file")
-		Xpath 8192			" X: 0
-	    endif
-	    if post
-		Xpath 16384			" X: 0
-		Xout "FileReadPost commands executed after write error"
-	    endif
-	    au! TMP
-	    aug! TMP
-	endtry
-    catch /.*/
-	Xpath 32768				" X: 0
-	Xout v:exception "in" v:throwpoint
-    finally
-	break		" discard error for $VIMNOERRTHROW
-    endtry
-endwhile
-
-while 1
-    try
-	let infile = tempname()
-	let tmpfile = tempname()
-	exec "!echo XYZ >" . infile
-	exec "edit" tmpfile
-	try
-	    Xpath 65536				" X: 65536
-	    try
-		let post = 0
-		aug TMP
-		    au! FileReadPre  * asdf
-		    au! FileReadPost * let post = 1
-		aug END
-		let caught = 0
-		exec "0read" infile
-	    catch /^Vim\((read)\)\=:/
-		let caught = 1
-		let v:errmsg = substitute(v:exception, '^Vim\((read)\)\=:', '',
-		    \ "")
-	    finally
-		Xpath 131072			" X: 131072
-		if !caught && !$VIMNOERRTHROW
-		    Xpath 262144		" X: 0
-		endif
-		let v:errmsg = substitute(v:errmsg, ' '.infile.'$', '', "")
-		if !MSG('E492', "Not an editor command")
-		    Xpath 524288		" X: 0
-		endif
-		if getline("1") == "XYZ"
-		    Xpath 1048576		" X: 0
-		    Xout ":read command not suppressed after FileReadPre error"
-		endif
-		if post
-		    Xpath 2097152		" X: 0
-		    Xout "FileReadPost commands executed after " .
-			\ "FileReadPre error"
-		endif
-		au! TMP
-		aug! TMP
-	    endtry
-	finally
-	    bwipeout!
-	endtry
-    catch /.*/
-	Xpath 4194304				" X: 0
-	Xout v:exception "in" v:throwpoint
-    finally
-	break		" discard error for $VIMNOERRTHROW
-    endtry
-endwhile
-
-call delete(infile)
-call delete(tmpfile)
-unlet! caught post infile tmpfile
-delfunction MSG
-delfunction Delete_autocommands
-
-Xcheck 198689
-
-"-------------------------------------------------------------------------------
-" Test 86:  setloclist crash						    {{{1
-"
-"	    Executing a setloclist() on BufUnload shouldn't crash Vim
-"-------------------------------------------------------------------------------
-
-func F
-    au BufUnload * :call setloclist(0, [{'bufnr':1, 'lnum':1, 'col':1, 'text': 'tango down'}])
-
-    :lvimgrep /.*/ *.mak
-endfunc
-
-XpathINIT
-
-ExecAsScript F
-
-delfunction F
-Xout  "No Crash for vimgrep on BufUnload"
-Xcheck 0 
-
-" Test 87 was moved to test_vimscript.vim
-let Xtest = 88
-
-
-"-------------------------------------------------------------------------------
-" Test 88:  $VIMNOERRTHROW and $VIMNOINTTHROW support			    {{{1
-"
-"	    It is possible to configure Vim for throwing exceptions on error
-"	    or interrupt, controlled by variables $VIMNOERRTHROW and
-"	    $VIMNOINTTHROW.  This is just for increasing the number of tests.
-"	    All tests here should run for all four combinations of setting
-"	    these variables to 0 or 1.  The variables are intended for the
-"	    development phase only.  In the final release, Vim should be
-"	    configured to always use error and interrupt exceptions.
-"
-"	    The test result is "OK",
-"
-"		- if the $VIMNOERRTHROW and the $VIMNOINTTHROW control are not
-"		  configured and exceptions are thrown on error and on
-"		  interrupt.
-"
-"		- if the $VIMNOERRTHROW or the $VIMNOINTTHROW control is
-"		  configured and works as intended.
-"
-"	    What actually happens, is shown in the test output.
-"
-"	    Otherwise, the test result is "FAIL", and the test output describes
-"	    the problem.
-"
-" IMPORTANT:  This must be the last test because it sets $VIMNOERRTHROW and
-"	      $VIMNOINTTHROW.
-"-------------------------------------------------------------------------------
-
-XpathINIT
-
-if ExtraVim()
-
-    function! ThrowOnError()
-	XloopNEXT
-	let caught = 0
-	try
-	    Xloop 1				" X: 1 + 8 + 64
-	    asdf
-	catch /.*/
-	    let caught = 1	" error exception caught
-	finally
-	    Xloop 2				" X: 2 + 16 + 128
-	    return caught	" discard aborting error
-	endtry
-	Xloop 4					" X: 0
-    endfunction
-
-    let quits_skipped = 0
-
-    function! ThrowOnInterrupt()
-	XloopNEXT
-	let caught = 0
-	try
-	    Xloop 1				" X: (1 + 8 + 64) * 512
-	    "INTERRUPT3
-	    let dummy = 0
-	    let g:quits_skipped = g:quits_skipped + 1
-	catch /.*/
-	    let caught = 1	" interrupt exception caught
-	finally
-	    Xloop 2				" X: (2 + 16 + 128) * 512
-	    return caught	" discard interrupt
-	endtry
-	Xloop 4					" X: 0
-    endfunction
-
-    function! CheckThrow(Type)
-	execute 'return ThrowOn' . a:Type . '()'
-    endfunction
-
-    function! CheckConfiguration(type)	    " type is "error" or "interrupt"
-
-	let type = a:type
-	let Type = substitute(type, '.*', '\u&', "")
-	let VAR = '$VIMNO' . substitute(type, '\(...\).*', '\U\1', "") . 'THROW'
-
-	if type == "error"
-	    XloopINIT! 1 8
-	elseif type == "interrupt"
-	    XloopINIT! 512 8
-	endif
-
-	exec 'let requested_for_tests = exists(VAR) && ' . VAR . ' == 0'
-	exec 'let suppressed_for_tests = ' . VAR . ' != 0'
-	let used_in_tests = CheckThrow(Type)
-
-	exec 'let ' . VAR . ' = 0'
-	let request_works = CheckThrow(Type)
-
-	exec 'let ' . VAR . ' = 1'
-	let suppress_works = !CheckThrow(Type)
-
-	if type == "error"
-	    XloopINIT! 262144 8
-	elseif type == "interrupt"
-	    XloopINIT! 2097152 8
-
-	    if g:quits_skipped != 0
-		Xloop 1				" X: 0*2097152
-		Xout "Test environment error.  Interrupt breakpoints skipped: "
-		    \ . g:quits_skipped . ".\n"
-		    \ . "Cannot check whether interrupt exceptions are thrown."
-		return
-	    endif
-	endif
-
-	let failure =
-	    \ !suppressed_for_tests && !used_in_tests
-	    \ || !request_works
-
-	let contradiction =
-	    \ used_in_tests
-		\ ? suppressed_for_tests && !request_works
-		\ : !suppressed_for_tests
-
-	if failure
-	    " Failure in configuration.
-	    Xloop 2				" X: 0 * 2*  (262144 + 2097152)
-	elseif contradiction
-	    " Failure in test logic.  Should not happen.
-	    Xloop 4				" X: 0 * 4 * (262144 + 2097152)
-	endif
-
-	let var_control_configured =
-	    \ request_works != used_in_tests
-	    \ || suppress_works == used_in_tests
-
-	let var_control_not_configured =
-	    \ requested_for_tests || suppressed_for_tests
-		\ ? request_works && !suppress_works
-		\ : request_works == used_in_tests
-		    \ && suppress_works != used_in_tests
-
-	let with = used_in_tests ? "with" : "without"
-
-	let set = suppressed_for_tests ? "non-zero" :
-	    \ requested_for_tests ? "0" : "unset"
-
-	let although = contradiction && !var_control_not_configured
-	    \ ? ",\nalthough "
-	    \ : ".\n"
-
-	let output = "All tests were run " . with . " throwing exceptions on "
-	    \ . type . although
-
-	if !var_control_not_configured
-	    let output = output . VAR . " was " . set . "."
-
-	    if !request_works && !requested_for_tests
-		let output = output .
-		    \ "\n" . Type . " exceptions are not thrown when " . VAR .
-		    \ " is\nset to 0."
-	    endif
-
-	    if !suppress_works && (!used_in_tests ||
-	    \ !request_works &&
-	    \ !requested_for_tests && !suppressed_for_tests)
-		let output = output .
-		    \ "\n" . Type . " exceptions are thrown when " . VAR .
-		    \ " is set to 1."
-	    endif
-
-	    if !failure && var_control_configured
-		let output = output .
-		    \ "\nRun tests also with " . substitute(VAR, '^\$', '', "")
-		    \ . "=" . used_in_tests . "."
-		    \ . "\nThis is for testing in the development phase only."
-		    \ . "  Remove the \n"
-		    \ . VAR . " control in the final release."
-	    endif
-	else
-	    let output = output .
-		\ "The " . VAR . " control is not configured."
-	endif
-
-	Xout output
-    endfunction
-
-    call CheckConfiguration("error")
-    Xpath 16777216				" X: 16777216
-    call CheckConfiguration("interrupt")
-    Xpath 33554432				" X: 33554432
-endif
-
-Xcheck 50443995
-
-" IMPORTANT: No test should be added after this test because it changes
-"	     $VIMNOERRTHROW and $VIMNOINTTHROW.
-
-
-"-------------------------------------------------------------------------------
-" Modelines								    {{{1
-" vim: ts=8 sw=4 tw=80 fdm=marker
-"-------------------------------------------------------------------------------
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index e71a3df..6a86b1d 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -5040,4 +5040,27 @@
   new | only!
 endfunc
 
+" Test for the crash fixed by 7.3.715
+func Test_setloclist_crash()
+  %bw!
+  let g:BufNum = bufnr()
+  augroup QF_Test
+    au!
+    au BufUnload * call setloclist(0, [{'bufnr':g:BufNum, 'lnum':1, 'col':1, 'text': 'tango down'}])
+  augroup END
+
+  try
+    lvimgrep /.*/ *.mak
+  catch /E926:/
+  endtry
+  call assert_equal('tango down', getloclist(0, {'items' : 0}).items[0].text)
+  call assert_equal(1, getloclist(0, {'size' : 0}).size)
+
+  augroup QF_Test
+    au!
+  augroup END
+  unlet g:BufNum
+  %bw!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_vimscript.vim b/src/testdir/test_vimscript.vim
index e63f647..1b00fc9 100644
--- a/src/testdir/test_vimscript.vim
+++ b/src/testdir/test_vimscript.vim
@@ -1,5 +1,6 @@
 " Test various aspects of the Vim script language.
-" Most of this was formerly in test49.
+" Most of this was formerly in test49.vim (developed by Servatius Brandt
+" <Servatius.Brandt@fujitsu-siemens.com>)
 
 source check.vim
 source shared.vim
@@ -5868,7 +5869,7 @@
   call RunInNewVim(test, verify)
 endfunc
 
-" TODO: Not able inject an interrupt after throwing an exception
+" TODO: Need to interrupt the code before the endtry is invoked
 func Disable_Test_discard_exception_after_error_2()
   let test =<< trim [CODE]
     try
@@ -5892,6 +5893,507 @@
 endfunc
 
 "-------------------------------------------------------------------------------
+" Test 82:  Ignoring :catch clauses after an error or interrupt		    {{{1
+"
+"	    When an exception is thrown and an error or interrupt occurs before
+"	    the matching :catch clause is reached, the exception is discarded
+"	    and the :catch clause is ignored (also for the error or interrupt
+"	    exception being thrown then).
+"-------------------------------------------------------------------------------
+
+func Test_ignore_catch_after_error_1()
+  let test =<< trim [CODE]
+    try
+      try
+        Xpath 'a'
+        throw "arrgh"
+        call assert_report('should not get here')
+        if 1
+        call assert_report('should not get here')
+        " error after :throw: missing :endif
+      catch /.*/
+        call assert_report('should not get here')
+      catch /.*/
+        call assert_report('should not get here')
+      endtry
+      call assert_report('should not get here')
+    catch /arrgh/
+      call assert_report('should not get here')
+    endtry
+    call assert_report('should not get here')
+  [CODE]
+  let verify =<< trim [CODE]
+    call assert_equal('a', g:Xpath)
+  [CODE]
+  call RunInNewVim(test, verify)
+endfunc
+
+func Test_ignore_catch_after_error_2()
+  let test =<< trim [CODE]
+    func E()
+      try
+        try
+          Xpath 'a'
+          throw "arrgh"
+          call assert_report('should not get here')
+          if 1
+          call assert_report('should not get here')
+          " error after :throw: missing :endif
+        catch /.*/
+          call assert_report('should not get here')
+        catch /.*/
+          call assert_report('should not get here')
+        endtry
+        call assert_report('should not get here')
+      catch /arrgh/
+        call assert_report('should not get here')
+      endtry
+    endfunc
+
+    call E()
+    call assert_report('should not get here')
+  [CODE]
+  let verify =<< trim [CODE]
+    call assert_equal('a', g:Xpath)
+  [CODE]
+  call RunInNewVim(test, verify)
+endfunc
+
+" TODO: Need to interrupt the code right before the catch is invoked
+func FIXME_Test_ignore_catch_after_intr_1()
+  let test =<< trim [CODE]
+    try
+      try
+        Xpath 'a'
+        throw "arrgh"
+        call assert_report('should not get here')
+      catch /.*/              " TODO: Need to interrupt before this catch is
+        call interrupt()      " invoked
+        call assert_report('should not get here')
+      catch /.*/
+        call assert_report('should not get here')
+      endtry
+      call assert_report('should not get here')
+    catch /arrgh/
+      call assert_report('should not get here')
+    endtry
+    call assert_report('should not get here')
+  [CODE]
+  let verify =<< trim [CODE]
+    call assert_equal('a', g:Xpath)
+  [CODE]
+  call RunInNewVim(test, verify)
+endfunc
+
+" TODO: Need to interrupt the code right before the catch is invoked
+func FIXME_Test_ignore_catch_after_intr_2()
+  let test =<< trim [CODE]
+    func I()
+      try
+        try
+          Xpath 'a'
+          throw "arrgh"
+          call assert_report('should not get here')
+        catch /.*/              " TODO: Need to interrupt before this catch is
+                                " invoked
+          call interrupt()
+          call assert_report('should not get here')
+        catch /.*/
+          call assert_report('should not get here')
+        endtry
+        call assert_report('should not get here')
+      catch /arrgh/
+        call assert_report('should not get here')
+      endtry
+    endfunc
+
+    call I()
+    call assert_report('should not get here')
+  [CODE]
+  let verify =<< trim [CODE]
+    call assert_equal('a', g:Xpath)
+  [CODE]
+  call RunInNewVim(test, verify)
+endfunc
+
+"-------------------------------------------------------------------------------
+" Test 83:  Executing :finally clauses after an error or interrupt	    {{{1
+"
+"	    When an exception is thrown and an error or interrupt occurs before
+"	    the :finally of the innermost :try is reached, the exception is
+"	    discarded and the :finally clause is executed.
+"-------------------------------------------------------------------------------
+
+func Test_finally_after_error()
+  let test =<< trim [CODE]
+    try
+      Xpath 'a'
+      try
+        Xpath 'b'
+        throw "arrgh"
+        call assert_report('should not get here')
+        if 1
+        call assert_report('should not get here')
+        " error after :throw: missing :endif
+      finally
+        Xpath 'c'
+      endtry
+      call assert_report('should not get here')
+    catch /arrgh/
+      call assert_report('should not get here')
+    endtry
+    call assert_report('should not get here')
+  [CODE]
+  let verify =<< trim [CODE]
+    call assert_equal('abc', g:Xpath)
+  [CODE]
+  call RunInNewVim(test, verify)
+endfunc
+
+" TODO: Need to interrupt the code right before the finally is invoked
+func FIXME_Test_finally_after_intr()
+  let test =<< trim [CODE]
+    try
+      Xpath 'a'
+      try
+        Xpath 'b'
+        throw "arrgh"
+        call assert_report('should not get here')
+      finally		" TODO: Need to interrupt before the finally is invoked
+        Xpath 'c'
+      endtry
+      call assert_report('should not get here')
+    catch /arrgh/
+      call assert_report('should not get here')
+    endtry
+    call assert_report('should not get here')
+  [CODE]
+  let verify =<< trim [CODE]
+    call assert_equal('abc', g:Xpath)
+  [CODE]
+  call RunInNewVim(test, verify)
+endfunc
+
+"-------------------------------------------------------------------------------
+" Test 84:  Exceptions in autocommand sequences.			    {{{1
+"
+"	    When an exception occurs in a sequence of autocommands for
+"	    a specific event, the rest of the sequence is not executed.  The
+"	    command that triggered the autocommand execution aborts, and the
+"	    exception is propagated to the caller.
+"
+"	    For the FuncUndefined event under a function call expression or
+"	    :call command, the function is not executed, even when it has
+"	    been defined by the autocommands before the exception occurred.
+"-------------------------------------------------------------------------------
+
+func Test_autocmd_exception()
+  let test =<< trim [CODE]
+    func INT()
+      call interrupt()
+    endfunc
+
+    aug TMP
+      autocmd!
+
+      autocmd User x1 Xpath 'a'
+      autocmd User x1 throw "x1"
+      autocmd User x1 call assert_report('should not get here')
+
+      autocmd User x2 Xpath 'b'
+      autocmd User x2 asdf
+      autocmd User x2 call assert_report('should not get here')
+
+      autocmd User x3 Xpath 'c'
+      autocmd User x3 call INT()
+      autocmd User x3 call assert_report('should not get here')
+
+      autocmd FuncUndefined U1 func U1()
+      autocmd FuncUndefined U1   call assert_report('should not get here')
+      autocmd FuncUndefined U1 endfunc
+      autocmd FuncUndefined U1 Xpath 'd'
+      autocmd FuncUndefined U1 throw "U1"
+      autocmd FuncUndefined U1 call assert_report('should not get here')
+
+      autocmd FuncUndefined U2 func U2()
+      autocmd FuncUndefined U2   call assert_report('should not get here')
+      autocmd FuncUndefined U2 endfunc
+      autocmd FuncUndefined U2 Xpath 'e'
+      autocmd FuncUndefined U2 ASDF
+      autocmd FuncUndefined U2 call assert_report('should not get here')
+
+      autocmd FuncUndefined U3 func U3()
+      autocmd FuncUndefined U3   call assert_report('should not get here')
+      autocmd FuncUndefined U3 endfunc
+      autocmd FuncUndefined U3 Xpath 'f'
+      autocmd FuncUndefined U3 call INT()
+      autocmd FuncUndefined U3 call assert_report('should not get here')
+    aug END
+
+    try
+      try
+        Xpath 'g'
+        doautocmd User x1
+      catch /x1/
+        Xpath 'h'
+      endtry
+
+      while 1
+        try
+          Xpath 'i'
+          doautocmd User x2
+        catch /asdf/
+          Xpath 'j'
+        finally
+          Xpath 'k'
+          break
+        endtry
+      endwhile
+
+      while 1
+        try
+          Xpath 'l'
+          doautocmd User x3
+        catch /Vim:Interrupt/
+          Xpath 'm'
+        finally
+          Xpath 'n'
+          " ... but break loop for caught interrupt exception,
+          " or discard interrupt and break loop if $VIMNOINTTHROW
+          break
+        endtry
+      endwhile
+
+      if exists("*U1") | delfunction U1 | endif
+      if exists("*U2") | delfunction U2 | endif
+      if exists("*U3") | delfunction U3 | endif
+
+      try
+        Xpath 'o'
+        call U1()
+      catch /U1/
+        Xpath 'p'
+      endtry
+
+      while 1
+        try
+          Xpath 'q'
+          call U2()
+        catch /ASDF/
+          Xpath 'r'
+        finally
+          Xpath 's'
+          " ... but break loop for caught error exception,
+          " or discard error and break loop if $VIMNOERRTHROW
+          break
+        endtry
+      endwhile
+
+      while 1
+        try
+          Xpath 't'
+          call U3()
+        catch /Vim:Interrupt/
+          Xpath 'u'
+        finally
+          Xpath 'v'
+          " ... but break loop for caught interrupt exception,
+          " or discard interrupt and break loop if $VIMNOINTTHROW
+          break
+        endtry
+      endwhile
+    catch /.*/
+      call assert_report('should not get here')
+    endtry
+    Xpath 'w'
+  [CODE]
+  let verify =<< trim [CODE]
+    call assert_equal('gahibjklcmnodpqerstfuvw', g:Xpath)
+  [CODE]
+  call RunInNewVim(test, verify)
+endfunc
+
+"-------------------------------------------------------------------------------
+" Test 85:  Error exceptions in autocommands for I/O command events	    {{{1
+"
+"	    When an I/O command is inside :try/:endtry, autocommands to be
+"	    executed after it should be skipped on an error (exception) in the
+"	    command itself or in autocommands to be executed before the command.
+"	    In the latter case, the I/O command should not be executed either.
+"	    Example 1: BufWritePre, :write, BufWritePost
+"	    Example 2: FileReadPre, :read, FileReadPost.
+"-------------------------------------------------------------------------------
+
+func Test_autocmd_error_io_exception()
+  let test =<< trim [CODE]
+    " Remove the autocommands for the events specified as arguments in all used
+    " autogroups.
+    func Delete_autocommands(...)
+      let augfile = tempname()
+      while 1
+        try
+          exec "redir >" . augfile
+          aug
+          redir END
+          exec "edit" augfile
+          g/^$/d
+          norm G$
+          let wrap = "w"
+          while search('\%(  \|^\)\@<=.\{-}\%(  \)\@=', wrap) > 0
+            let wrap = "W"
+            exec "norm y/  \n"
+            let argno = 1
+            while argno <= a:0
+              exec "au!" escape(@", " ") a:{argno}
+              let argno = argno + 1
+            endwhile
+          endwhile
+        catch /.*/
+        finally
+          bwipeout!
+          call delete(augfile)
+          break
+        endtry
+      endwhile
+    endfunc
+
+    call Delete_autocommands("BufWritePre", "BufWritePost")
+
+    while 1
+      try
+        try
+          let post = 0
+          aug TMP
+            au! BufWritePost * let post = 1
+          aug END
+          write /n/o/n/e/x/i/s/t/e/n/t
+        catch /^Vim(write):/
+          Xpath 'a'
+          call assert_match("E212: Can't open file for writing", v:exception)
+        finally
+          Xpath 'b'
+          call assert_equal(0, post)
+          au! TMP
+          aug! TMP
+        endtry
+      catch /.*/
+        call assert_report('should not get here')
+      finally
+        Xpath 'c'
+        break
+      endtry
+    endwhile
+
+    while 1
+      try
+        try
+          let post = 0
+          aug TMP
+            au! BufWritePre  * asdf
+            au! BufWritePost * let post = 1
+          aug END
+          let tmpfile = tempname()
+          exec "write" tmpfile
+        catch /^Vim\((write)\)\=:/
+          Xpath 'd'
+          call assert_match('E492: Not an editor command', v:exception)
+        finally
+          Xpath 'e'
+          if filereadable(tmpfile)
+            call assert_report('should not get here')
+          endif
+          call assert_equal(0, post)
+          au! TMP
+          aug! TMP
+        endtry
+      catch /.*/
+        call assert_report('should not get here')
+      finally
+        Xpath 'f'
+        break
+      endtry
+    endwhile
+
+    call delete(tmpfile)
+
+    call Delete_autocommands("BufWritePre", "BufWritePost",
+          \ "BufReadPre", "BufReadPost", "FileReadPre", "FileReadPost")
+
+    while 1
+      try
+        try
+          let post = 0
+          aug TMP
+            au! FileReadPost * let post = 1
+          aug END
+          let caught = 0
+          read /n/o/n/e/x/i/s/t/e/n/t
+        catch /^Vim(read):/
+          Xpath 'g'
+          call assert_match("E484: Can't open file", v:exception)
+        finally
+          Xpath 'h'
+          call assert_equal(0, post)
+          au! TMP
+          aug! TMP
+        endtry
+      catch /.*/
+        call assert_report('should not get here')
+      finally
+        Xpath 'i'
+        break
+      endtry
+    endwhile
+
+    while 1
+      try
+        let infile = tempname()
+        let tmpfile = tempname()
+        call writefile(["XYZ"], infile)
+        exec "edit" tmpfile
+        try
+          Xpath 'j'
+          try
+            let post = 0
+            aug TMP
+              au! FileReadPre  * asdf
+              au! FileReadPost * let post = 1
+            aug END
+            exec "0read" infile
+          catch /^Vim\((read)\)\=:/
+            Xpath 'k'
+            call assert_match('E492: Not an editor command', v:exception)
+          finally
+            Xpath 'l'
+            if getline("1") == "XYZ"
+              call assert_report('should not get here')
+            endif
+            call assert_equal(0, post)
+            au! TMP
+            aug! TMP
+          endtry
+        finally
+          Xpath 'm'
+          bwipeout!
+        endtry
+      catch /.*/
+        call assert_report('should not get here')
+      finally
+        Xpath 'n'
+        break
+      endtry
+    endwhile
+
+    call delete(infile)
+    call delete(tmpfile)
+  [CODE]
+  let verify =<< trim [CODE]
+    call assert_equal('abcdefghijklmn', g:Xpath)
+  [CODE]
+  call RunInNewVim(test, verify)
+endfunc
+
+"-------------------------------------------------------------------------------
 " Test 87   using (expr) ? funcref : funcref				    {{{1
 "
 "	    Vim needs to correctly parse the funcref and even when it does
diff --git a/src/version.c b/src/version.c
index 990b945..a31436b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1420,
+/**/
     1419,
 /**/
     1418,
