Patch 8.2.1383
Problem:    Test 49 is old style.
Solution:   Convert test cases to new style. (Yegappan Lakshmanan,
            closes #6638)
Files:      src/testdir/test49.ok, src/testdir/test49.vim,
            src/testdir/test_vimscript.vim


*** ../vim-8.2.1382/src/testdir/test49.ok       2020-08-05 11:20:45.174462615 
+0200
--- src/testdir/test49.ok       2020-08-07 16:47:00.954221297 +0200
***************
*** 1,18 ****
  Results of test49.vim:
- *** Test  52: OK (1247112011)
- *** Test  53: OK (131071)
- *** Test  54: OK (2047)
- *** Test  55: OK (1023)
- *** Test  56: OK (511)
- *** Test  57: OK (2147450880)
- *** Test  58: OK (624945)
  *** Test  59: OK (2038431743)
  *** Test  60: OK (311511339)
- *** Test  61: OK (374889517)
  *** Test  62: OK (286331153)
  *** Test  63: OK (236978127)
  *** Test  64: OK (1499645335)
- *** Test  65: OK (70187)
  *** Test  66: OK (5464)
  *** Test  67: OK (212514423)
  *** Test  68: OK (212514423)
--- 1,9 ----
*** ../vim-8.2.1382/src/testdir/test49.vim      2020-08-05 11:20:45.174462615 
+0200
--- src/testdir/test49.vim      2020-08-07 16:47:00.954221297 +0200
***************
*** 607,629 ****
  
  " END_OF_TEST_ENVIRONMENT - do not change or remove this line.
  
- " Tests 1 to 50, 87 were moved to test_vimscript.vim
- " Tests 25, 26, 32, 33, 41-48, 51, 69-75 were moved to test_trycatch.vim
- let Xtest = 52
- 
- 
"-------------------------------------------------------------------------------
- " Test 52:  Uncaught exceptions                                               
    {{{1
- "
- "         When an exception is thrown but not caught, an error message is
- "         displayed when the script is terminated.  In case of an interrupt
- "         or error exception, the normal interrupt or error message(s) are
- "         displayed.
- 
"-------------------------------------------------------------------------------
- 
- XpathINIT
- 
- let msgfile = tempname()
- 
  function! MESSAGES(...)
      try
        exec "edit" g:msgfile
--- 607,612 ----
***************
*** 665,1604 ****
      return match
  endfunction
  
- if ExtraVim(msgfile)
-     Xpath 1                                   " X: 1
-     throw "arrgh"
- endif
- 
- Xpath 2                                               " X: 2
- if !MESSAGES('E605', "Exception not caught")
-     Xpath 4                                   " X: 0
- endif
- 
- if ExtraVim(msgfile)
-     try
-       Xpath 8                                 " X: 8
-       throw "oops"
-     catch /arrgh/
-       Xpath 16                                " X: 0
-     endtry
-     Xpath 32                                  " X: 0
- endif
- 
- Xpath 64                                      " X: 64
- if !MESSAGES('E605', "Exception not caught")
-     Xpath 128                                 " X: 0
- endif
- 
- if ExtraVim(msgfile)
-     function! T()
-       throw "brrr"
-     endfunction
- 
-     try
-       Xpath 256                               " X: 256
-       throw "arrgh"
-     catch /.*/
-       Xpath 512                               " X: 512
-       call T()
-     endtry
-     Xpath 1024                                        " X: 0
- endif
- 
- Xpath 2048                                    " X: 2048
- if !MESSAGES('E605', "Exception not caught")
-     Xpath 4096                                        " X: 0
- endif
- 
- if ExtraVim(msgfile)
-     try
-       Xpath 8192                              " X: 8192
-       throw "arrgh"
-     finally
-       Xpath 16384                             " X: 16384
-       throw "brrr"
-     endtry
-     Xpath 32768                                       " X: 0
- endif
- 
- Xpath 65536                                   " X: 65536
- if !MESSAGES('E605', "Exception not caught")
-     Xpath 131072                              " X: 0
- endif
- 
- if ExtraVim(msgfile)
-     try
-       Xpath 262144                            " X: 262144
-       "INTERRUPT
-     endtry
-     Xpath 524288                              " X: 0
- endif
- 
- Xpath 1048576                                 " X: 1048576
- if !MESSAGES('INT', "Interrupted")
-     Xpath 2097152                             " X: 0
- endif
- 
- if ExtraVim(msgfile)
-     try
-       Xpath 4194304                           " X: 4194304
-       let x = novar   " error E121; exception: E121
-     catch /E15:/      " should not catch
-       Xpath 8388608                           " X: 0
-     endtry
-     Xpath 16777216                            " X: 0
- endif
- 
- Xpath 33554432                                        " X: 33554432
- if !MESSAGES('E121', "Undefined variable")
-     Xpath 67108864                            " X: 0
- endif
- 
- if ExtraVim(msgfile)
-     try
-       Xpath 134217728                         " X: 134217728
- "     unlet novar #   " error E108/E488; exception: E488
-     catch /E108:/     " should not catch
-       Xpath 268435456                         " X: 0
-     endtry
-     Xpath 536870912                           " X: 0
- endif
- 
- Xpath 1073741824                              " X: 1073741824
- if !MESSAGES('E108', "No such variable", 'E488', "Trailing characters")
-     " The Xpath command does not accept 2^31 (negative); add explicitly:
-     let Xpath = Xpath + 2147483648            " X: 0
- endif
- 
- call delete(msgfile)
- unlet msgfile
- 
- Xcheck 1247112011
- 
  " Leave MESSAGES() for the next tests.
  
! 
! 
"-------------------------------------------------------------------------------
! " Test 53:  Nesting errors: :endif/:else/:elseif                          {{{1
! "
! "         For nesting errors of :if conditionals the correct error messages
! "         should be given.
! "
! "         This test reuses the function MESSAGES() from the previous test.
! "         This functions checks the messages in g:msgfile.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let msgfile = tempname()
! 
! if ExtraVim(msgfile)
! "   endif
! endif
! if MESSAGES('E580', ":endif without :if")
!     Xpath 1                                   " X: 1
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       endif
! "   endwhile
! endif
! if MESSAGES('E580', ":endif without :if")
!     Xpath 2                                   " X: 2
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "   finally
! "       endif
! "   endtry
! endif
! if MESSAGES('E580', ":endif without :if")
!     Xpath 4                                   " X: 4
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       endif
! "   endtry
! endif
! if MESSAGES('E580', ":endif without :if")
!     Xpath 8                                   " X: 8
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       throw "a"
! "   catch /a/
! "       endif
! "   endtry
! endif
! if MESSAGES('E580', ":endif without :if")
!     Xpath 16                                  " X: 16
! endif
! 
! if ExtraVim(msgfile)
! "   else
! endif
! if MESSAGES('E581', ":else without :if")
!     Xpath 32                                  " X: 32
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       else
! "   endwhile
! endif
! if MESSAGES('E581', ":else without :if")
!     Xpath 64                                  " X: 64
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "   finally
! "       else
! "   endtry
! endif
! if MESSAGES('E581', ":else without :if")
!     Xpath 128                                 " X: 128
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       else
! "   endtry
! endif
! if MESSAGES('E581', ":else without :if")
!     Xpath 256                                 " X: 256
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       throw "a"
! "   catch /a/
! "       else
! "   endtry
! endif
! if MESSAGES('E581', ":else without :if")
!     Xpath 512                                 " X: 512
! endif
! 
! if ExtraVim(msgfile)
! "   elseif
! endif
! if MESSAGES('E582', ":elseif without :if")
!     Xpath 1024                                        " X: 1024
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       elseif
! "   endwhile
! endif
! if MESSAGES('E582', ":elseif without :if")
!     Xpath 2048                                        " X: 2048
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "   finally
! "       elseif
! "   endtry
! endif
! if MESSAGES('E582', ":elseif without :if")
!     Xpath 4096                                        " X: 4096
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       elseif
! "   endtry
! endif
! if MESSAGES('E582', ":elseif without :if")
!     Xpath 8192                                        " X: 8192
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       throw "a"
! "   catch /a/
! "       elseif
! "   endtry
! endif
! if MESSAGES('E582', ":elseif without :if")
!     Xpath 16384                                       " X: 16384
! endif
! 
! if ExtraVim(msgfile)
! "   if 1
! "   else
! "   else
! "   endif
! endif
! if MESSAGES('E583', "multiple :else")
!     Xpath 32768                                       " X: 32768
! endif
! 
! if ExtraVim(msgfile)
! "   if 1
! "   else
! "   elseif 1
! "   endif
! endif
! if MESSAGES('E584', ":elseif after :else")
!     Xpath 65536                                       " X: 65536
! endif
! 
! call delete(msgfile)
! unlet msgfile
! 
! Xcheck 131071
! 
! " Leave MESSAGES() for the next test.
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 54:  Nesting errors: :while/:endwhile                              {{{1
! "
! "         For nesting errors of :while conditionals the correct error messages
! "         should be given.
! "
! "         This test reuses the function MESSAGES() from the previous test.
! "         This functions checks the messages in g:msgfile.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let msgfile = tempname()
! 
! if ExtraVim(msgfile)
! "   endwhile
! endif
! if MESSAGES('E588', ":endwhile without :while")
!     Xpath 1                                   " X: 1
! endif
! 
! if ExtraVim(msgfile)
! "   if 1
! "       endwhile
! "   endif
! endif
! if MESSAGES('E588', ":endwhile without :while")
!     Xpath 2                                   " X: 2
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       if 1
! "   endwhile
! endif
! if MESSAGES('E171', "Missing :endif")
!     Xpath 4                                   " X: 4
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "   finally
! "       endwhile
! "   endtry
! endif
! if MESSAGES('E588', ":endwhile without :while")
!     Xpath 8                                   " X: 8
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       try
! "       finally
! "   endwhile
! endif
! if MESSAGES('E600', "Missing :endtry")
!     Xpath 16                                  " X: 16
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       if 1
! "         try
! "         finally
! "   endwhile
! endif
! if MESSAGES('E600', "Missing :endtry")
!     Xpath 32                                  " X: 32
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       try
! "       finally
! "         if 1
! "   endwhile
! endif
! if MESSAGES('E171', "Missing :endif")
!     Xpath 64                                  " X: 64
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       endwhile
! "   endtry
! endif
! if MESSAGES('E588', ":endwhile without :while")
!     Xpath 128                                 " X: 128
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       try
! "         endwhile
! "       endtry
! "   endwhile
! endif
! if MESSAGES('E588', ":endwhile without :while")
!     Xpath 256                                 " X: 256
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       throw "a"
! "   catch /a/
! "       endwhile
! "   endtry
! endif
! if MESSAGES('E588', ":endwhile without :while")
!     Xpath 512                                 " X: 512
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       try
! "         throw "a"
! "     catch /a/
! "         endwhile
! "       endtry
! "   endwhile
! endif
! if MESSAGES('E588', ":endwhile without :while")
!     Xpath 1024                                        " X: 1024
! endif
! 
! 
! call delete(msgfile)
! unlet msgfile
! 
! Xcheck 2047
! 
! " Leave MESSAGES() for the next test.
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 55:  Nesting errors: :continue/:break                              {{{1
! "
! "         For nesting errors of :continue and :break commands the correct
! "         error messages should be given.
! "
! "         This test reuses the function MESSAGES() from the previous test.
! "         This functions checks the messages in g:msgfile.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let msgfile = tempname()
! 
! if ExtraVim(msgfile)
! "   continue
! endif
! if MESSAGES('E586', ":continue without :while")
!     Xpath 1                                   " X: 1
! endif
! 
! if ExtraVim(msgfile)
! "   if 1
! "       continue
! "   endif
! endif
! if MESSAGES('E586', ":continue without :while")
!     Xpath 2                                   " X: 2
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "   finally
! "       continue
! "   endtry
! endif
! if MESSAGES('E586', ":continue without :while")
!     Xpath 4                                   " X: 4
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       continue
! "   endtry
! endif
! if MESSAGES('E586', ":continue without :while")
!     Xpath 8                                   " X: 8
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       throw "a"
! "   catch /a/
! "       continue
! "   endtry
! endif
! if MESSAGES('E586', ":continue without :while")
!     Xpath 16                                  " X: 16
! endif
! 
! if ExtraVim(msgfile)
! "   break
! endif
! if MESSAGES('E587', ":break without :while")
!     Xpath 32                                  " X: 32
! endif
! 
! if ExtraVim(msgfile)
! "   if 1
! "       break
! "   endif
! endif
! if MESSAGES('E587', ":break without :while")
!     Xpath 64                                  " X: 64
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "   finally
! "       break
! "   endtry
! endif
! if MESSAGES('E587', ":break without :while")
!     Xpath 128                                 " X: 128
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       break
! "   endtry
! endif
! if MESSAGES('E587', ":break without :while")
!     Xpath 256                                 " X: 256
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       throw "a"
! "   catch /a/
! "       break
! "   endtry
! endif
! if MESSAGES('E587', ":break without :while")
!     Xpath 512                                 " X: 512
! endif
! 
! call delete(msgfile)
! unlet msgfile
! 
! Xcheck 1023
! 
! " Leave MESSAGES() for the next test.
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 56:  Nesting errors: :endtry                                       {{{1
! "
! "         For nesting errors of :try conditionals the correct error messages
! "         should be given.
! "
! "         This test reuses the function MESSAGES() from the previous test.
! "         This functions checks the messages in g:msgfile.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let msgfile = tempname()
! 
! if ExtraVim(msgfile)
! "   endtry
! endif
! if MESSAGES('E602', ":endtry without :try")
!     Xpath 1                                   " X: 1
! endif
! 
! if ExtraVim(msgfile)
! "   if 1
! "       endtry
! "   endif
! endif
! if MESSAGES('E602', ":endtry without :try")
!     Xpath 2                                   " X: 2
! endif
! 
! if ExtraVim(msgfile)
! "   while 1
! "       endtry
! "   endwhile
! endif
! if MESSAGES('E602', ":endtry without :try")
!     Xpath 4                                   " X: 4
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       if 1
! "   endtry
! endif
! if MESSAGES('E171', "Missing :endif")
!     Xpath 8                                   " X: 8
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       while 1
! "   endtry
! endif
! if MESSAGES('E170', "Missing :endwhile")
!     Xpath 16                                  " X: 16
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "   finally
! "       if 1
! "   endtry
! endif
! if MESSAGES('E171', "Missing :endif")
!     Xpath 32                                  " X: 32
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "   finally
! "       while 1
! "   endtry
! endif
! if MESSAGES('E170', "Missing :endwhile")
!     Xpath 64                                  " X: 64
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       throw "a"
! "   catch /a/
! "       if 1
! "   endtry
! endif
! if MESSAGES('E171', "Missing :endif")
!     Xpath 128                                 " X: 128
! endif
! 
! if ExtraVim(msgfile)
! "   try
! "       throw "a"
! "   catch /a/
! "       while 1
! "   endtry
! endif
! if MESSAGES('E170', "Missing :endwhile")
!     Xpath 256                                 " X: 256
! endif
! 
! call delete(msgfile)
! unlet msgfile
! 
! delfunction MESSAGES
! 
! Xcheck 511
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 57:  v:exception and v:throwpoint for user exceptions              {{{1
! "
! "         v:exception evaluates to the value of the exception that was caught
! "         most recently and is not finished.  (A caught exception is finished
! "         when the next ":catch", ":finally", or ":endtry" is reached.)
! "         v:throwpoint evaluates to the script/function name and line number
! "         where that exception has been thrown.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! function! FuncException()
!     let g:exception = v:exception
! endfunction
! 
! function! FuncThrowpoint()
!     let g:throwpoint = v:throwpoint
! endfunction
! 
! let scriptException  = MakeScript("FuncException")
! let scriptThrowPoint = MakeScript("FuncThrowpoint")
! 
! command! CmdException  let g:exception  = v:exception
! command! CmdThrowpoint let g:throwpoint = v:throwpoint
! 
! XloopINIT! 1 2
! 
! function! CHECK(n, exception, throwname, throwline)
!     XloopNEXT
!     let error = 0
!     if v:exception != a:exception
!       Xout a:n.": v:exception is" v:exception "instead of" a:exception
!       let error = 1
!     endif
!     if v:throwpoint !~ a:throwname
!       let name = escape(a:throwname, '\')
!       Xout a:n.": v:throwpoint (".v:throwpoint.") does not match" name
!       let error = 1
!     endif
!     if v:throwpoint !~ a:throwline
!       let line = escape(a:throwline, '\')
!       Xout a:n.": v:throwpoint (".v:throwpoint.") does not match" line
!       let error = 1
!     endif
!     if error
!       Xloop 1                                 " X: 0
!     endif
! endfunction
! 
! function! T(arg, line)
!     if a:line == 2
!       throw a:arg             " in line 2
!     elseif a:line == 4
!       throw a:arg             " in line 4
!     elseif a:line == 6
!       throw a:arg             " in line 6
!     elseif a:line == 8
!       throw a:arg             " in line 8
!     endif
! endfunction
! 
! function! G(arg, line)
!     call T(a:arg, a:line)
! endfunction
! 
! function! F(arg, line)
!     call G(a:arg, a:line)
! endfunction
! 
! let scriptT = MakeScript("T")
! let scriptG = MakeScript("G", scriptT)
! let scriptF = MakeScript("F", scriptG)
! 
! try
!     Xpath 32768                                       " X: 32768
!     call F("oops", 2)
! catch /.*/
!     Xpath 65536                                       " X: 65536
!     let exception  = v:exception
!     let throwpoint = v:throwpoint
!     call CHECK(1, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
!     exec "let exception  = v:exception"
!     exec "let throwpoint = v:throwpoint"
!     call CHECK(2, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
!     CmdException
!     CmdThrowpoint
!     call CHECK(3, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
!     call FuncException()
!     call FuncThrowpoint()
!     call CHECK(4, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
!     exec "source" scriptException
!     exec "source" scriptThrowPoint
!     call CHECK(5, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
!     try
!       Xpath 131072                            " X: 131072
!       call G("arrgh", 4)
!     catch /.*/
!       Xpath 262144                            " X: 262144
!       let exception  = v:exception
!       let throwpoint = v:throwpoint
!       call CHECK(6, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
!       try
!           Xpath 524288                        " X: 524288
!           let g:arg = "autsch"
!           let g:line = 6
!           exec "source" scriptF
!       catch /.*/
!           Xpath 1048576                       " X: 1048576
!           let exception  = v:exception
!           let throwpoint = v:throwpoint
!           " Symbolic links in tempname()s are not resolved, whereas resolving
!           " is done for v:throwpoint.  Resolve the temporary file name for
!           " scriptT, so that it can be matched against v:throwpoint.
!           call CHECK(7, "autsch", resolve(scriptT), '\<6\>')
!       finally
!           Xpath 2097152                       " X: 2097152
!           let exception  = v:exception
!           let throwpoint = v:throwpoint
!           call CHECK(8, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
!           try
!               Xpath 4194304                   " X: 4194304
!               let g:arg = "brrrr"
!               let g:line = 8
!               exec "source" scriptG
!           catch /.*/
!               Xpath 8388608                   " X: 8388608
!               let exception  = v:exception
!               let throwpoint = v:throwpoint
!               " Resolve scriptT for matching it against v:throwpoint.
!               call CHECK(9, "brrrr", resolve(scriptT), '\<8\>')
!           finally
!               Xpath 16777216                  " X: 16777216
!               let exception  = v:exception
!               let throwpoint = v:throwpoint
!               call CHECK(10, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
!           endtry
!           Xpath 33554432                      " X: 33554432
!           let exception  = v:exception
!           let throwpoint = v:throwpoint
!           call CHECK(11, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
!       endtry
!       Xpath 67108864                          " X: 67108864
!       let exception  = v:exception
!       let throwpoint = v:throwpoint
!       call CHECK(12, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
!     finally
!       Xpath 134217728                         " X: 134217728
!       let exception  = v:exception
!       let throwpoint = v:throwpoint
!       call CHECK(13, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
!     endtry
!     Xpath 268435456                           " X: 268435456
!     let exception  = v:exception
!     let throwpoint = v:throwpoint
!     call CHECK(14, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
! finally
!     Xpath 536870912                           " X: 536870912
!     let exception  = v:exception
!     let throwpoint = v:throwpoint
!     call CHECK(15, "", '^$', '^$')
! endtry
! 
! Xpath 1073741824                              " X: 1073741824
! 
! unlet exception throwpoint
! delfunction FuncException
! delfunction FuncThrowpoint
! call delete(scriptException)
! call delete(scriptThrowPoint)
! unlet scriptException scriptThrowPoint
! delcommand CmdException
! delcommand CmdThrowpoint
! delfunction T
! delfunction G
! delfunction F
! call delete(scriptT)
! call delete(scriptG)
! call delete(scriptF)
! unlet scriptT scriptG scriptF
! 
! Xcheck 2147450880
! 
! 
! 
"-------------------------------------------------------------------------------
! "
! " Test 58:  v:exception and v:throwpoint for error/interrupt exceptions       
    {{{1
! "
! "         v:exception and v:throwpoint work also for error and interrupt
! "         exceptions.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! if ExtraVim()
! 
!     function! T(line)
!       if a:line == 2
!           delfunction T               " error (function in use) in line 2
!       elseif a:line == 4
!           let dummy = 0               " INTERRUPT1 - interrupt in line 4
!       endif
!     endfunction
! 
!     while 1
!       try
!           Xpath 1                             " X: 1
!           let caught = 0
!           call T(2)
!       catch /.*/
!           let caught = 1
!           if v:exception !~ 'Vim(delfunction):'
!               Xpath 2                         " X: 0
!           endif
!           if v:throwpoint !~ '\<T\>'
!               Xpath 4                         " X: 0
!           endif
!           if v:throwpoint !~ '\<2\>'
!               Xpath 8                         " X: 0
!           endif
!       finally
!           Xpath 16                            " X: 16
!           if caught || $VIMNOERRTHROW
!               Xpath 32                        " X: 32
!           endif
!           if v:exception != ""
!               Xpath 64                        " X: 0
!           endif
!           if v:throwpoint != ""
!               Xpath 128                       " X: 0
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
! 
!     Xpath 256                                 " X: 256
!     if v:exception != ""
!       Xpath 512                               " X: 0
!     endif
!     if v:throwpoint != ""
!       Xpath 1024                              " X: 0
!     endif
! 
!     while 1
!       try
!           Xpath 2048                          " X: 2048
!           let caught = 0
!           call T(4)
!       catch /.*/
!           let caught = 1
!           if v:exception != 'Vim:Interrupt'
!               Xpath 4096                      " X: 0
!           endif
!           if v:throwpoint !~ '\<T\>'
!               Xpath 8192                      " X: 0
!           endif
!           if v:throwpoint !~ '\<4\>'
!               Xpath 16384                     " X: 0
!           endif
!       finally
!           Xpath 32768                         " X: 32768
!           if caught || $VIMNOINTTHROW
!               Xpath 65536                     " X: 65536
!           endif
!           if v:exception != ""
!               Xpath 131072                    " X: 0
!           endif
!           if v:throwpoint != ""
!               Xpath 262144                    " X: 0
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
! 
!     Xpath 524288                              " X: 524288
!     if v:exception != ""
!       Xpath 1048576                           " X: 0
!     endif
!     if v:throwpoint != ""
!       Xpath 2097152                           " X: 0
!     endif
! 
! endif
! 
! Xcheck 624945
! 
  
  
"-------------------------------------------------------------------------------
  "
--- 648,658 ----
      return match
  endfunction
  
  " Leave MESSAGES() for the next tests.
  
! " Tests 1 to 50, 52 to 57, 87 were moved to test_vimscript.vim
! " Tests 25, 26, 32, 33, 41-48, 51, 69-75 were moved to test_trycatch.vim
! let Xtest = 59
  
  
"-------------------------------------------------------------------------------
  "
***************
*** 2067,2208 ****
  
  Xcheck 311511339
  
! 
! 
"-------------------------------------------------------------------------------
! " Test 61:  Catching interrupt exceptions                                 {{{1
! "
! "         When an interrupt occurs inside a :try/:endtry region, an
! "         interrupt exception is thrown and can be caught.  Its value is
! "         "Vim:Interrupt".  If the interrupt occurs after an error or a :throw
! "         but before a matching :catch is reached, all following :catches of
! "         that try block are ignored, but the interrupt exception can be
! "         caught by the next surrounding try conditional.  An interrupt is
! "         ignored when there is a previous interrupt that has not been caught
! "         or causes a :finally clause to be executed.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! if ExtraVim()
! 
!     while 1
!       try
!           try
!               Xpath 1                         " X: 1
!               let caught = 0
!               "INTERRUPT
!               Xpath 2                         " X: 0
!           catch /^Vim:Interrupt$/
!               let caught = 1
!           finally
!               Xpath 4                         " X: 4
!               if caught || $VIMNOINTTHROW
!                   Xpath 8                     " X: 8
!               endif
!           endtry
!       catch /.*/
!           Xpath 16                            " X: 0
!           Xout v:exception "in" v:throwpoint
!       finally
!           break               " discard interrupt for $VIMNOINTTHROW
!       endtry
!     endwhile
! 
!     while 1
!       try
!           try
!               let caught = 0
!               try
!                   Xpath 32                    " X: 32
!                   asdf
!                   Xpath 64                    " X: 0
!               catch /do_not_catch/
!                   Xpath 128                   " X: 0
!               catch /.*/      "INTERRUPT - throw interrupt if !$VIMNOERRTHROW
!                   Xpath 256                   " X: 0
!               catch /.*/
!                   Xpath 512                   " X: 0
!               finally         "INTERRUPT - throw interrupt if $VIMNOERRTHROW
!                   Xpath 1024                  " X: 1024
!               endtry
!           catch /^Vim:Interrupt$/
!               let caught = 1
!           finally
!               Xpath 2048                      " X: 2048
!               if caught || $VIMNOINTTHROW
!                   Xpath 4096                  " X: 4096
!               endif
!           endtry
!       catch /.*/
!           Xpath 8192                          " X: 0
!           Xout v:exception "in" v:throwpoint
!       finally
!           break               " discard interrupt for $VIMNOINTTHROW
!       endtry
!     endwhile
! 
!     while 1
!       try
!           try
!               let caught = 0
!               try
!                   Xpath 16384                 " X: 16384
!                   throw "x"
!                   Xpath 32768                 " X: 0
!               catch /do_not_catch/
!                   Xpath 65536                 " X: 0
!               catch /x/       "INTERRUPT
!                   Xpath 131072                " X: 0
!               catch /.*/
!                   Xpath 262144                " X: 0
!               endtry
!           catch /^Vim:Interrupt$/
!               let caught = 1
!           finally
!               Xpath 524288                    " X: 524288
!               if caught || $VIMNOINTTHROW
!                   Xpath 1048576               " X: 1048576
!               endif
!           endtry
!       catch /.*/
!           Xpath 2097152                       " X: 0
!           Xout v:exception "in" v:throwpoint
!       finally
!           break               " discard interrupt for $VIMNOINTTHROW
!       endtry
!     endwhile
! 
!     while 1
!       try
!           let caught = 0
!           try
!               Xpath 4194304                   " X: 4194304
!               "INTERRUPT
!               Xpath 8388608                   " X: 0
!           catch /do_not_catch/ "INTERRUPT
!               Xpath 16777216                  " X: 0
!           catch /^Vim:Interrupt$/
!               let caught = 1
!           finally
!               Xpath 33554432                  " X: 33554432
!               if caught || $VIMNOINTTHROW
!                   Xpath 67108864              " X: 67108864
!               endif
!           endtry
!       catch /.*/
!           Xpath 134217728                     " X: 0
!           Xout v:exception "in" v:throwpoint
!       finally
!           break               " discard interrupt for $VIMNOINTTHROW
!       endtry
!     endwhile
! 
!     Xpath 268435456                           " X: 268435456
! 
! endif
! 
! Xcheck 374889517
! 
  
  
"-------------------------------------------------------------------------------
  " Test 62:  Catching error exceptions                                     {{{1
--- 1121,1128 ----
  
  Xcheck 311511339
  
! " Test 61 was moved to test_vimscript.vim
! let Xtest = 62
  
  
"-------------------------------------------------------------------------------
  " Test 62:  Catching error exceptions                                     {{{1
***************
*** 2725,2824 ****
  
  Xcheck 1499645335
  
! 
! 
"-------------------------------------------------------------------------------
! " Test 65:  Errors in the /pattern/ argument of a :catch                  {{{1
! "
! "         On an error in the /pattern/ argument of a :catch, the :catch does
! "         not match.  Any following :catches of the same :try/:endtry don't
! "         match either.  Finally clauses are executed.
! 
"-------------------------------------------------------------------------------
! 
! 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
! 
! try
!     try
!       Xpath 1                                 " X: 1
!       throw "oops"
!     catch /^oops$/
!       Xpath 2                                 " X: 2
!     catch /\)/                " not checked; exception has already been caught
!       Xpath 4                                 " X: 0
!     endtry
!     Xpath 8                                   " X: 8
! catch /.*/
!     Xpath 16                                  " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! function! F()
!     try
!       let caught = 0
!       try
!           try
!               Xpath 32                        " X: 32
!               throw "ab"
!           catch /abc/ " does not catch
!               Xpath 64                        " X: 0
!           catch /\)/  " error; discards exception
!               Xpath 128                       " X: 0
!           catch /.*/  " not checked
!               Xpath 256                       " X: 0
!           finally
!               Xpath 512                       " X: 512
!           endtry
!           Xpath 1024                          " X: 0
!       catch /^ab$/    " checked, but original exception is discarded
!           Xpath 2048                          " X: 0
!       catch /^Vim(catch):/
!           let caught = 1
!           let v:errmsg = substitute(v:exception, '^Vim(catch):', '', "")
!       finally
!           Xpath 4096                          " X: 4096
!           if !caught && !$VIMNOERRTHROW
!               Xpath 8192                      " X: 0
!           endif
!           if !MSG('E475', "Invalid argument")
!               Xpath 16384                     " X: 0
!           endif
!           if !caught
!               return  | " discard error
!           endif
!       endtry
!     catch /.*/
!       Xpath 32768                             " X: 0
!       Xout v:exception "in" v:throwpoint
!     endtry
! endfunction
! 
! call F()
! Xpath 65536                                   " X: 65536
! 
! delfunction MSG
! delfunction F
! unlet! caught
! 
! Xcheck 70187
! 
  
  
"-------------------------------------------------------------------------------
  " Test 66:  Stop range :call on error, interrupt, or :throw               {{{1
--- 1645,1652 ----
  
  Xcheck 1499645335
  
! " Test 65 was moved to test_vimscript.vim
! let Xtest = 66
  
  
"-------------------------------------------------------------------------------
  " Test 66:  Stop range :call on error, interrupt, or :throw               {{{1
*** ../vim-8.2.1382/src/testdir/test_vimscript.vim      2020-08-05 
11:20:45.178462605 +0200
--- src/testdir/test_vimscript.vim      2020-08-07 16:47:00.954221297 +0200
***************
*** 2764,2769 ****
--- 2764,3916 ----
  endfunc
  
  
"-------------------------------------------------------------------------------
+ " Test 52:  Uncaught exceptions                                               
    {{{1
+ "
+ "         When an exception is thrown but not caught, an error message is
+ "         displayed when the script is terminated.  In case of an interrupt
+ "         or error exception, the normal interrupt or error message(s) are
+ "         displayed.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_uncaught_exception_1()
+   CheckEnglish
+ 
+   let test =<< trim [CODE]
+     Xpath 'a'
+     throw "arrgh"
+     call assert_report('should not get here')`
+   [CODE]
+   let verify =<< trim [CODE]
+     call assert_equal('E605: Exception not caught: arrgh', v:errmsg)
+     call assert_equal('a', g:Xpath)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ func Test_uncaught_exception_2()
+   CheckEnglish
+ 
+   let test =<< trim [CODE]
+     try
+       Xpath 'a'
+       throw "oops"
+       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('E605: Exception not caught: oops', v:errmsg)
+     call assert_equal('a', g:Xpath)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ func Test_uncaught_exception_3()
+   CheckEnglish
+ 
+   let test =<< trim [CODE]
+     func T()
+       Xpath 'c'
+       throw "brrr"
+       call assert_report('should not get here')`
+     endfunc
+ 
+     try
+       Xpath 'a'
+       throw "arrgh"
+       call assert_report('should not get here')`
+     catch /.*/
+       Xpath 'b'
+       call T()
+       call assert_report('should not get here')`
+     endtry
+     call assert_report('should not get here')`
+   [CODE]
+   let verify =<< trim [CODE]
+     call assert_equal('E605: Exception not caught: brrr', v:errmsg)
+     call assert_equal('abc', g:Xpath)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ func Test_uncaught_exception_4()
+   CheckEnglish
+ 
+   let test =<< trim [CODE]
+     try
+       Xpath 'a'
+       throw "arrgh"
+       call assert_report('should not get here')`
+     finally
+       Xpath 'b'
+       throw "brrr"
+       call assert_report('should not get here')`
+     endtry
+     call assert_report('should not get here')`
+   [CODE]
+   let verify =<< trim [CODE]
+     call assert_equal('E605: Exception not caught: brrr', v:errmsg)
+     call assert_equal('ab', g:Xpath)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ func Test_uncaught_exception_5()
+   CheckEnglish
+ 
+   " Need to catch and handle interrupt, otherwise the test will wait for the
+   " user to press <Enter> to continue
+   let test =<< trim [CODE]
+     try
+       try
+         Xpath 'a'
+         call interrupt()
+         call assert_report('should not get here')
+       endtry
+       call assert_report('should not get here')
+     catch /^Vim:Interrupt$/
+       Xpath 'b'
+     endtry
+   [CODE]
+   let verify =<< trim [CODE]
+     call assert_equal('ab', g:Xpath)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ func Test_uncaught_exception_6()
+   CheckEnglish
+ 
+   let test =<< trim [CODE]
+     try
+       Xpath 'a'
+       let x = novar   " error E121; exception: E121
+     catch /E15:/      " should not catch
+       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)
+     call assert_equal('E121: Undefined variable: novar', v:errmsg)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ func Test_uncaught_exception_7()
+   CheckEnglish
+ 
+   let test =<< trim [CODE]
+     try
+       Xpath 'a'
+       " error E108/E488; exception: E488
+       unlet novar #
+     catch /E108:/       " should not catch
+       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)
+     call assert_equal('E488: Trailing characters: #', v:errmsg)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 53:  Nesting errors: :endif/:else/:elseif                          {{{1
+ "
+ "         For nesting errors of :if conditionals the correct error messages
+ "         should be given.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_nested_if_else_errors()
+   CheckEnglish
+ 
+   " :endif without :if
+   let code =<< trim END
+     endif
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without 
:if')
+ 
+   " :endif without :if
+   let code =<< trim END
+     while 1
+       endif
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without 
:if')
+ 
+   " :endif without :if
+   let code =<< trim END
+     try
+     finally
+       endif
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without 
:if')
+ 
+   " :endif without :if
+   let code =<< trim END
+     try
+       endif
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without 
:if')
+ 
+   " :endif without :if
+   let code =<< trim END
+     try
+       throw "a"
+     catch /a/
+       endif
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without 
:if')
+ 
+   " :else without :if
+   let code =<< trim END
+     else
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+ 
+   " :else without :if
+   let code =<< trim END
+     while 1
+       else
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+ 
+   " :else without :if
+   let code =<< trim END
+     try
+     finally
+       else
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+ 
+   " :else without :if
+   let code =<< trim END
+     try
+       else
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+ 
+   " :else without :if
+   let code =<< trim END
+     try
+       throw "a"
+     catch /a/
+       else
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+ 
+   " :elseif without :if
+   let code =<< trim END
+     elseif
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without 
:if')
+ 
+   " :elseif without :if
+   let code =<< trim END
+     while 1
+       elseif
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without 
:if')
+ 
+   " :elseif without :if
+   let code =<< trim END
+     try
+     finally
+       elseif
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without 
:if')
+ 
+   " :elseif without :if
+   let code =<< trim END
+     try
+       elseif
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without 
:if')
+ 
+   " :elseif without :if
+   let code =<< trim END
+     try
+       throw "a"
+     catch /a/
+       elseif
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without 
:if')
+ 
+   " multiple :else
+   let code =<< trim END
+     if 1
+     else
+     else
+     endif
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(else):E583: multiple :else')
+ 
+   " :elseif after :else
+   let code =<< trim END
+     if 1
+     else
+     elseif 1
+     endif
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(elseif):E584: :elseif after 
:else')
+ 
+   call delete('Xtest')
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 54:  Nesting errors: :while/:endwhile                              {{{1
+ "
+ "         For nesting errors of :while conditionals the correct error messages
+ "         should be given.
+ "
+ "         This test reuses the function MESSAGES() from the previous test.
+ "         This functions checks the messages in g:msgfile.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_nested_while_error()
+   CheckEnglish
+ 
+   " :endwhile without :while
+   let code =<< trim END
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile 
without :while')
+ 
+   " :endwhile without :while
+   let code =<< trim END
+     if 1
+       endwhile
+     endif
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile 
without :while')
+ 
+   " Missing :endif
+   let code =<< trim END
+     while 1
+       if 1
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif')
+ 
+   " :endwhile without :while
+   let code =<< trim END
+     try
+     finally
+       endwhile
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile 
without :while')
+ 
+   " Missing :endtry
+   let code =<< trim END
+     while 1
+       try
+       finally
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing 
:endtry')
+ 
+   " Missing :endtry
+   let code =<< trim END
+     while 1
+       if 1
+         try
+         finally
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing 
:endtry')
+ 
+   " Missing :endif
+   let code =<< trim END
+     while 1
+       try
+       finally
+         if 1
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif')
+ 
+   " :endwhile without :while
+   let code =<< trim END
+     try
+       endwhile
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile 
without :while')
+ 
+   " :endwhile without :while
+   let code =<< trim END
+     while 1
+       try
+         endwhile
+       endtry
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile 
without :while')
+ 
+   " :endwhile without :while
+   let code =<< trim END
+     try
+       throw "a"
+     catch /a/
+       endwhile
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile 
without :while')
+ 
+   " :endwhile without :while
+   let code =<< trim END
+     while 1
+       try
+         throw "a"
+       catch /a/
+         endwhile
+       endtry
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile 
without :while')
+ 
+   call delete('Xtest')
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 55:  Nesting errors: :continue/:break                              {{{1
+ "
+ "         For nesting errors of :continue and :break commands the correct
+ "         error messages should be given.
+ "
+ "         This test reuses the function MESSAGES() from the previous test.
+ "         This functions checks the messages in g:msgfile.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_nested_cont_break_error()
+   CheckEnglish
+ 
+   " :continue without :while
+   let code =<< trim END
+     continue
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(continue):E586: :continue 
without :while or :for')
+ 
+   " :continue without :while
+   let code =<< trim END
+     if 1
+       continue
+     endif
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(continue):E586: :continue 
without :while or :for')
+ 
+   " :continue without :while
+   let code =<< trim END
+     try
+     finally
+       continue
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(continue):E586: :continue 
without :while or :for')
+ 
+   " :continue without :while
+   let code =<< trim END
+     try
+       continue
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(continue):E586: :continue 
without :while or :for')
+ 
+   " :continue without :while
+   let code =<< trim END
+     try
+       throw "a"
+     catch /a/
+       continue
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(continue):E586: :continue 
without :while or :for')
+ 
+   " :break without :while
+   let code =<< trim END
+     break
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(break):E587: :break without 
:while or :for')
+ 
+   " :break without :while
+   let code =<< trim END
+     if 1
+       break
+     endif
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(break):E587: :break without 
:while or :for')
+ 
+   " :break without :while
+   let code =<< trim END
+     try
+     finally
+       break
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(break):E587: :break without 
:while or :for')
+ 
+   " :break without :while
+   let code =<< trim END
+     try
+       break
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(break):E587: :break without 
:while or :for')
+ 
+   " :break without :while
+   let code =<< trim END
+     try
+       throw "a"
+     catch /a/
+       break
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(break):E587: :break without 
:while or :for')
+ 
+   call delete('Xtest')
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 56:  Nesting errors: :endtry                                       {{{1
+ "
+ "         For nesting errors of :try conditionals the correct error messages
+ "         should be given.
+ "
+ "         This test reuses the function MESSAGES() from the previous test.
+ "         This functions checks the messages in g:msgfile.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_nested_endtry_error()
+   CheckEnglish
+ 
+   " :endtry without :try
+   let code =<< trim END
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without 
:try')
+ 
+   " :endtry without :try
+   let code =<< trim END
+     if 1
+       endtry
+     endif
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without 
:try')
+ 
+   " :endtry without :try
+   let code =<< trim END
+     while 1
+       endtry
+     endwhile
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without 
:try')
+ 
+   " Missing :endif
+   let code =<< trim END
+     try
+         if 1
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
+ 
+   " Missing :endwhile
+   let code =<< trim END
+     try
+       while 1
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing 
:endwhile')
+ 
+   " Missing :endif
+   let code =<< trim END
+     try
+     finally
+       if 1
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
+ 
+   " Missing :endwhile
+   let code =<< trim END
+     try
+     finally
+       while 1
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing 
:endwhile')
+ 
+   " Missing :endif
+   let code =<< trim END
+     try
+       throw "a"
+     catch /a/
+       if 1
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
+ 
+   " Missing :endwhile
+   let code =<< trim END
+     try
+       throw "a"
+     catch /a/
+       while 1
+     endtry
+   END
+   call writefile(code, 'Xtest')
+   call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing 
:endwhile')
+ 
+   call delete('Xtest')
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 57:  v:exception and v:throwpoint for user exceptions              {{{1
+ "
+ "         v:exception evaluates to the value of the exception that was caught
+ "         most recently and is not finished.  (A caught exception is finished
+ "         when the next ":catch", ":finally", or ":endtry" is reached.)
+ "         v:throwpoint evaluates to the script/function name and line number
+ "         where that exception has been thrown.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_user_exception_info()
+   CheckEnglish
+ 
+   XpathINIT
+   XloopINIT
+ 
+   func FuncException()
+     let g:exception = v:exception
+   endfunc
+ 
+   func FuncThrowpoint()
+     let g:throwpoint = v:throwpoint
+   endfunc
+ 
+   let scriptException  = MakeScript("FuncException")
+   let scriptThrowPoint = MakeScript("FuncThrowpoint")
+ 
+   command! CmdException  let g:exception  = v:exception
+   command! CmdThrowpoint let g:throwpoint = v:throwpoint
+ 
+   func T(arg, line)
+     if a:line == 2
+       throw a:arg             " in line 2
+     elseif a:line == 4
+       throw a:arg             " in line 4
+     elseif a:line == 6
+       throw a:arg             " in line 6
+     elseif a:line == 8
+       throw a:arg             " in line 8
+     endif
+   endfunc
+ 
+   func G(arg, line)
+     call T(a:arg, a:line)
+   endfunc
+ 
+   func F(arg, line)
+     call G(a:arg, a:line)
+   endfunc
+ 
+   let scriptT = MakeScript("T")
+   let scriptG = MakeScript("G", scriptT)
+   let scriptF = MakeScript("F", scriptG)
+ 
+   try
+     Xpath 'a'
+     call F("oops", 2)
+   catch /.*/
+     Xpath 'b'
+     let exception  = v:exception
+     let throwpoint = v:throwpoint
+     call assert_equal("oops", v:exception)
+     call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+     call assert_match('\<2\>', v:throwpoint)
+ 
+     exec "let exception  = v:exception"
+     exec "let throwpoint = v:throwpoint"
+     call assert_equal("oops", v:exception)
+     call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+     call assert_match('\<2\>', v:throwpoint)
+ 
+     CmdException
+     CmdThrowpoint
+     call assert_equal("oops", v:exception)
+     call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+     call assert_match('\<2\>', v:throwpoint)
+ 
+     call FuncException()
+     call FuncThrowpoint()
+     call assert_equal("oops", v:exception)
+     call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+     call assert_match('\<2\>', v:throwpoint)
+ 
+     exec "source" scriptException
+     exec "source" scriptThrowPoint
+     call assert_equal("oops", v:exception)
+     call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+     call assert_match('\<2\>', v:throwpoint)
+ 
+     try
+       Xpath 'c'
+       call G("arrgh", 4)
+     catch /.*/
+       Xpath 'd'
+       let exception  = v:exception
+       let throwpoint = v:throwpoint
+       call assert_equal("arrgh", v:exception)
+       call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+       call assert_match('\<4\>', v:throwpoint)
+ 
+       try
+         Xpath 'e'
+         let g:arg = "autsch"
+         let g:line = 6
+         exec "source" scriptF
+       catch /.*/
+         Xpath 'f'
+         let exception  = v:exception
+         let throwpoint = v:throwpoint
+         call assert_equal("autsch", v:exception)
+         call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint)
+         call assert_match('\<6\>', v:throwpoint)
+       finally
+         Xpath 'g'
+         let exception  = v:exception
+         let throwpoint = v:throwpoint
+         call assert_equal("arrgh", v:exception)
+         call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+         call assert_match('\<4\>', v:throwpoint)
+         try
+           Xpath 'h'
+           let g:arg = "brrrr"
+           let g:line = 8
+           exec "source" scriptG
+         catch /.*/
+           Xpath 'i'
+           let exception  = v:exception
+           let throwpoint = v:throwpoint
+           " Resolve scriptT for matching it against v:throwpoint.
+           call assert_equal("brrrr", v:exception)
+           call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint)
+           call assert_match('\<8\>', v:throwpoint)
+         finally
+           Xpath 'j'
+           let exception  = v:exception
+           let throwpoint = v:throwpoint
+           call assert_equal("arrgh", v:exception)
+           call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+           call assert_match('\<4\>', v:throwpoint)
+         endtry
+         Xpath 'k'
+         let exception  = v:exception
+         let throwpoint = v:throwpoint
+         call assert_equal("arrgh", v:exception)
+         call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+         call assert_match('\<4\>', v:throwpoint)
+       endtry
+       Xpath 'l'
+       let exception  = v:exception
+       let throwpoint = v:throwpoint
+       call assert_equal("arrgh", v:exception)
+       call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+       call assert_match('\<4\>', v:throwpoint)
+     finally
+       Xpath 'm'
+       let exception  = v:exception
+       let throwpoint = v:throwpoint
+       call assert_equal("oops", v:exception)
+       call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+       call assert_match('\<2\>', v:throwpoint)
+     endtry
+     Xpath 'n'
+     let exception  = v:exception
+     let throwpoint = v:throwpoint
+     call assert_equal("oops", v:exception)
+     call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+     call assert_match('\<2\>', v:throwpoint)
+   finally
+     Xpath 'o'
+     let exception  = v:exception
+     let throwpoint = v:throwpoint
+     call assert_equal("", v:exception)
+     call assert_match('^$', v:throwpoint)
+     call assert_match('^$', v:throwpoint)
+   endtry
+ 
+   call assert_equal('abcdefghijklmno', g:Xpath)
+ 
+   unlet exception throwpoint
+   delfunction FuncException
+   delfunction FuncThrowpoint
+   call delete(scriptException)
+   call delete(scriptThrowPoint)
+   unlet scriptException scriptThrowPoint
+   delcommand CmdException
+   delcommand CmdThrowpoint
+   delfunction T
+   delfunction G
+   delfunction F
+   call delete(scriptT)
+   call delete(scriptG)
+   call delete(scriptF)
+   unlet scriptT scriptG scriptF
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ "
+ " Test 58:  v:exception and v:throwpoint for error/interrupt exceptions       
    {{{1
+ "
+ "         v:exception and v:throwpoint work also for error and interrupt
+ "         exceptions.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_execption_info_for_error()
+   CheckEnglish
+ 
+   let test =<< trim [CODE]
+     func T(line)
+       if a:line == 2
+         delfunction T         " error (function in use) in line 2
+       elseif a:line == 4
+         call interrupt()
+       endif
+     endfunc
+ 
+     while 1
+       try
+         Xpath 'a'
+         call T(2)
+         call assert_report('should not get here')
+       catch /.*/
+         Xpath 'b'
+         if v:exception !~ 'Vim(delfunction):'
+           call assert_report('should not get here')
+         endif
+         if v:throwpoint !~ '\<T\>'
+           call assert_report('should not get here')
+         endif
+         if v:throwpoint !~ '\<2\>'
+           call assert_report('should not get here')
+         endif
+       finally
+         Xpath 'c'
+         if v:exception != ""
+           call assert_report('should not get here')
+         endif
+         if v:throwpoint != ""
+           call assert_report('should not get here')
+         endif
+         break
+       endtry
+     endwhile
+ 
+     Xpath 'd'
+     if v:exception != ""
+       call assert_report('should not get here')
+     endif
+     if v:throwpoint != ""
+       call assert_report('should not get here')
+     endif
+ 
+     while 1
+       try
+         Xpath 'e'
+         call T(4)
+         call assert_report('should not get here')
+       catch /.*/
+         Xpath 'f'
+         if v:exception != 'Vim:Interrupt'
+           call assert_report('should not get here')
+         endif
+         if v:throwpoint !~ 'function T'
+           call assert_report('should not get here')
+         endif
+         if v:throwpoint !~ '\<4\>'
+           call assert_report('should not get here')
+         endif
+       finally
+         Xpath 'g'
+         if v:exception != ""
+           call assert_report('should not get here')
+         endif
+         if v:throwpoint != ""
+           call assert_report('should not get here')
+         endif
+         break
+       endtry
+     endwhile
+ 
+     Xpath 'h'
+     if v:exception != ""
+       call assert_report('should not get here')
+     endif
+     if v:throwpoint != ""
+       call assert_report('should not get here')
+     endif
+   [CODE]
+   let verify =<< trim [CODE]
+     call assert_equal('abcdefgh', g:Xpath)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 61:  Catching interrupt exceptions                                 {{{1
+ "
+ "         When an interrupt occurs inside a :try/:endtry region, an
+ "         interrupt exception is thrown and can be caught.  Its value is
+ "         "Vim:Interrupt".  If the interrupt occurs after an error or a :throw
+ "         but before a matching :catch is reached, all following :catches of
+ "         that try block are ignored, but the interrupt exception can be
+ "         caught by the next surrounding try conditional.  An interrupt is
+ "         ignored when there is a previous interrupt that has not been caught
+ "         or causes a :finally clause to be executed.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_catch_intr_exception()
+   let test =<< trim [CODE]
+     while 1
+       try
+         try
+           Xpath 'a'
+           call interrupt()
+           call assert_report('should not get here')
+         catch /^Vim:Interrupt$/
+           Xpath 'b'
+         finally
+           Xpath 'c'
+         endtry
+       catch /.*/
+         call assert_report('should not get here')
+       finally
+         Xpath 'd'
+         break
+       endtry
+     endwhile
+ 
+     while 1
+       try
+         try
+           try
+             Xpath 'e'
+             asdf
+             call assert_report('should not get here')
+           catch /do_not_catch/
+             call assert_report('should not get here')
+           catch /.*/
+             Xpath 'f'
+             call interrupt()
+             call assert_report('should not get here')
+           catch /.*/
+             call assert_report('should not get here')
+           finally
+             Xpath 'g'
+             call interrupt()
+             call assert_report('should not get here')
+           endtry
+         catch /^Vim:Interrupt$/
+           Xpath 'h'
+         finally
+           Xpath 'i'
+         endtry
+       catch /.*/
+         call assert_report('should not get here')
+       finally
+         Xpath 'j'
+         break
+       endtry
+     endwhile
+ 
+     while 1
+       try
+         try
+           try
+             Xpath 'k'
+             throw "x"
+             call assert_report('should not get here')
+           catch /do_not_catch/
+             call assert_report('should not get here')
+           catch /x/
+             Xpath 'l'
+             call interrupt()
+             call assert_report('should not get here')
+           catch /.*/
+             call assert_report('should not get here')
+           endtry
+         catch /^Vim:Interrupt$/
+           Xpath 'm'
+         finally
+           Xpath 'n'
+         endtry
+       catch /.*/
+         call assert_report('should not get here')
+       finally
+         Xpath 'o'
+         break
+       endtry
+     endwhile
+ 
+     while 1
+       try
+         try
+           Xpath 'p'
+           call interrupt()
+           call assert_report('should not get here')
+         catch /do_not_catch/
+           call interrupt()
+           call assert_report('should not get here')
+         catch /^Vim:Interrupt$/
+           Xpath 'q'
+         finally
+           Xpath 'r'
+         endtry
+       catch /.*/
+         call assert_report('should not get here')
+       finally
+         Xpath 's'
+         break
+       endtry
+     endwhile
+ 
+     Xpath 't'
+   [CODE]
+   let verify =<< trim [CODE]
+     call assert_equal('abcdefghijklmnopqrst', g:Xpath)
+   [CODE]
+   call RunInNewVim(test, verify)
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 65:  Errors in the /pattern/ argument of a :catch                  {{{1
+ "
+ "         On an error in the /pattern/ argument of a :catch, the :catch does
+ "         not match.  Any following :catches of the same :try/:endtry don't
+ "         match either.  Finally clauses are executed.
+ 
"-------------------------------------------------------------------------------
+ 
+ func Test_catch_pattern_error()
+   CheckEnglish
+   XpathINIT
+ 
+   try
+     try
+       Xpath 'a'
+       throw "oops"
+     catch /^oops$/
+       Xpath 'b'
+     catch /\)/                " not checked; exception has already been caught
+       call assert_report('should not get here')
+     endtry
+     Xpath 'c'
+   catch /.*/
+     call assert_report('should not get here')
+   endtry
+   call assert_equal('abc', g:Xpath)
+ 
+   XpathINIT
+   func F()
+     try
+       try
+         try
+           Xpath 'a'
+           throw "ab"
+         catch /abc/   " does not catch
+           call assert_report('should not get here')
+         catch /\)/    " error; discards exception
+           call assert_report('should not get here')
+         catch /.*/    " not checked
+           call assert_report('should not get here')
+         finally
+           Xpath 'b'
+         endtry
+         call assert_report('should not get here')
+       catch /^ab$/    " checked, but original exception is discarded
+         call assert_report('should not get here')
+       catch /^Vim(catch):/
+         Xpath 'c'
+         call assert_match('Vim(catch):E475: Invalid argument:', v:exception)
+       finally
+         Xpath 'd'
+       endtry
+       Xpath 'e'
+     catch /.*/
+       call assert_report('should not get here')
+     endtry
+     Xpath 'f'
+   endfunc
+ 
+   call F()
+   call assert_equal('abcdef', g:Xpath)
+ 
+   delfunc F
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
  " Test 87   using (expr) ? funcref : funcref                              {{{1
  "
  "         Vim needs to correctly parse the funcref and even when it does
*** ../vim-8.2.1382/src/version.c       2020-08-06 22:11:02.565081026 +0200
--- src/version.c       2020-08-07 16:48:20.606021816 +0200
***************
*** 756,757 ****
--- 756,759 ----
  {   /* Add new patch number below this line */
+ /**/
+     1383,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
138. You develop a liking for cold coffee.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202008071449.077Enawo3854615%40masaka.moolenaar.net.

Raspunde prin e-mail lui