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
