Patch 8.1.2246
Problem:    Some tests are still in old style.
Solution:   Change a few tests to new style. (Yegappan Lakshmanan)
Files:      src/testdir/Make_all.mak, src/testdir/test49.ok,
            src/testdir/test49.vim, src/testdir/test_trycatch.vim,
            src/testdir/test_vimscript.vim


*** ../vim-8.1.2245/src/testdir/Make_all.mak    2019-10-16 19:27:23.613959056 
+0200
--- src/testdir/Make_all.mak    2019-11-03 16:09:05.317249724 +0100
***************
*** 267,272 ****
--- 267,273 ----
        test_textprop \
        test_timers \
        test_true_false \
+       test_trycatch \
        test_undo \
        test_unlet \
        test_user_func \
***************
*** 433,438 ****
--- 434,440 ----
        test_textformat.res \
        test_textobjects.res \
        test_textprop.res \
+       test_trycatch.res \
        test_undo.res \
        test_user_func.res \
        test_usercommands.res \
*** ../vim-8.1.2245/src/testdir/test49.ok       2016-01-02 19:36:45.000000000 
+0100
--- src/testdir/test49.ok       2019-11-03 16:09:05.317249724 +0100
***************
*** 1,6 ****
  Results of test49.vim:
- *** Test  16: OK (8722)
- *** Test  17: OK (285127993)
  *** Test  18: OK (67224583)
  *** Test  19: OK (69275973)
  *** Test  20: OK (1874575085)
--- 1,4 ----
***************
*** 8,23 ****
  *** Test  22: OK (4161)
  *** Test  23: OK (49)
  *** Test  24: OK (41)
- *** Test  25: OK (260177811)
- *** Test  26: OK (1681500476)
  *** Test  27: OK (1996459)
  *** Test  28: OK (1996459)
  *** Test  29: OK (170428555)
  *** Test  30: OK (190905173)
  *** Test  31: OK (190905173)
- *** Test  32: OK (354833067)
- --- Test  33: sum = 178275600 (ok)
- *** Test  33: OK (1216907538)
  *** Test  34: OK (2146584868)
  *** Test  35: OK (2146584868)
  *** Test  36: OK (1071644672)
--- 6,16 ----
***************
*** 25,41 ****
  *** Test  38: OK (357908480)
  *** Test  39: OK (357908480)
  *** Test  40: OK (357908480)
- *** Test  41: OK (3076095)
- *** Test  42: OK (1505155949)
- *** Test  43: OK (1157763329)
- *** Test  44: OK (1031761407)
- *** Test  45: OK (1157763329)
- *** Test  46: OK (739407)
- *** Test  47: OK (371213935)
- *** Test  48: OK (756255461)
  *** Test  49: OK (179000669)
  *** Test  50: OK (363550045)
- *** Test  51: OK (40744667)
  *** Test  52: OK (1247112011)
  *** Test  53: OK (131071)
  *** Test  54: OK (2047)
--- 18,25 ----
***************
*** 53,65 ****
  *** Test  66: OK (5464)
  *** Test  67: OK (212514423)
  *** Test  68: OK (212514423)
- *** Test  69: OK (8995471)
- *** Test  70: OK (69544277)
- *** Test  71: OK (34886997)
- *** Test  72: OK (1789569365)
- *** Test  73: OK (9032615)
- *** Test  74: OK (224907669)
- *** Test  75: OK (2000403408)
  *** Test  76: OK (1610087935)
  *** Test  77: OK (1388671)
  *** Test  78: OK (134217728)
--- 37,42 ----
***************
*** 72,82 ****
  *** Test  85: OK (198689)
  --- Test  86: No Crash for vimgrep on BufUnload
  *** Test  86: OK (0)
- --- Test  87: 3
- --- Test  87: 5
- --- Test  87: abcdefghijk
- --- Test  87: Successfully executed funcref Add2
- *** Test  87: 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.
--- 49,54 ----
*** ../vim-8.1.2245/src/testdir/test49.vim      2019-10-10 13:30:09.485605298 
+0200
--- src/testdir/test49.vim      2019-11-03 16:09:05.321249714 +0100
***************
*** 1,6 ****
  " Vim script language tests
  " Author:     Servatius Brandt <[email protected]>
! " Last Change:        2019 Oct 08
  
  
"-------------------------------------------------------------------------------
  " Test environment                                                        {{{1
--- 1,6 ----
  " Vim script language tests
  " Author:     Servatius Brandt <[email protected]>
! " Last Change:        2019 Nov 03
  
  
"-------------------------------------------------------------------------------
  " Test environment                                                        {{{1
***************
*** 608,803 ****
  " END_OF_TEST_ENVIRONMENT - do not change or remove this line.
  
  
! " Tests 1 to 15 were moved to test_vimscript.vim
! let Xtest = 16
! 
! 
"-------------------------------------------------------------------------------
! " Test 16:  Double :else or :elseif after :else                               
    {{{1
! "
! "         Multiple :elses or an :elseif after an :else are forbidden.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! function! F() abort
!     if 0
!       Xpath 1                                 " X: 0
!     else
!       Xpath 2                                 " X: 2
!     else              " aborts function
!       Xpath 4                                 " X: 0
!     endif
! endfunction
! 
! function! G() abort
!     if 0
!       Xpath 8                                 " X: 0
!     else
!       Xpath 16                                " X: 16
!     elseif 1          " aborts function
!       Xpath 32                                " X: 0
!     else
!       Xpath 64                                " X: 0
!     endif
! endfunction
! 
! function! H() abort
!     if 0
!       Xpath 128                               " X: 0
!     elseif 0
!       Xpath 256                               " X: 0
!     else
!       Xpath 512                               " X: 512
!     else              " aborts function
!       Xpath 1024                              " X: 0
!     endif
! endfunction
! 
! function! I() abort
!     if 0
!       Xpath 2048                              " X: 0
!     elseif 0
!       Xpath 4096                              " X: 0
!     else
!       Xpath 8192                              " X: 8192
!     elseif 1          " aborts function
!       Xpath 16384                             " X: 0
!     else
!       Xpath 32768                             " X: 0
!     endif
! endfunction
! 
! call F()
! call G()
! call H()
! call I()
! 
! delfunction F
! delfunction G
! delfunction H
! delfunction I
! 
! Xcheck 8722
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 17:  Nesting of unmatched :if or :endif inside a :while                
    {{{1
! "
! "         The :while/:endwhile takes precedence in nesting over an unclosed
! "         :if or an unopened :endif.
! 
"-------------------------------------------------------------------------------
! 
! 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
! 
! let messages = ""
! 
! " While loops inside a function are continued on error.
! function! F()
!     let v:errmsg = ""
!     XloopINIT 1 16
!     let loops = 3
!     while loops > 0
!       let loops = loops - 1                   "    2:  1:     0:
!       Xloop 1                                 " X: 1 + 1*16 + 1*16*16
!       if (loops == 1)
!           Xloop 2                             " X:     2*16
!           XloopNEXT
!           continue
!       elseif (loops == 0)
!           Xloop 4                             " X:            4*16*16
!           break
!       elseif 1
!           Xloop 8                             " X: 8
!           XloopNEXT
!       " endif missing!
!     endwhile  " :endwhile after :if 1
!     Xpath 4096                                        " X: 16*16*16
!     if MSG('E171', "Missing :endif")
!       let g:messages = g:messages . "A"
!     endif
! 
!     let v:errmsg = ""
!     XloopINIT! 8192 4
!     let loops = 2
!     while loops > 0                           "    2:     1:
!       XloopNEXT
!       let loops = loops - 1
!       Xloop 1                                 " X: 8192 + 8192*4
!       if 0
!           Xloop 2                             " X: 0
!       " endif missing
!     endwhile  " :endwhile after :if 0
!     Xpath 131072                              " X: 8192*4*4
!     if MSG('E171', "Missing :endif")
!       let g:messages = g:messages . "B"
!     endif
! 
!     let v:errmsg = ""
!     XloopINIT 262144 4
!     let loops = 2
!     while loops > 0                           "    2:     1:
!       let loops = loops - 1
!       Xloop 1                                 " X: 262144 + 262144 * 4
!       " if missing!
!       endif   " :endif without :if in while
!       Xloop 2                                 " X: 524288 + 524288 * 4
!       XloopNEXT
!     endwhile
!     Xpath 4194304                             " X: 262144*4*4
!     if MSG('E580', ":endif without :if")
!       let g:messages = g:messages . "C"
!     endif
! endfunction
! 
! call F()
! 
! " Error continuation outside a function is at the outermost :endwhile or 
:endif.
! let v:errmsg = ""
! XloopINIT! 8388608 4
! let loops = 2
! while loops > 0                                       "    2:         1:
!     XloopNEXT
!     let loops = loops - 1
!     Xloop 1                                   " X: 8388608 + 0 * 4
!     if 0
!       Xloop 2                                 " X: 0
!     " endif missing! Following :endwhile fails.
! endwhile | Xpath 134217728                    " X: 0
! Xpath 268435456                                       " X: 2*8388608*4*4
! if MSG('E171', "Missing :endif")
!     let messages = g:messages . "D"
! endif
! 
! if messages != "ABCD"
!     Xpath 536870912                           " X: 0
!     Xout "messages is" messages "instead of ABCD"
! endif
! 
! unlet loops messages
! delfunction F
! delfunction MSG
! 
! Xcheck 285127993
! 
  
  
"-------------------------------------------------------------------------------
  " Test 18:  Interrupt (Ctrl-C pressed)                                        
    {{{1
--- 608,615 ----
  " END_OF_TEST_ENVIRONMENT - do not change or remove this line.
  
  
! " Tests 1 to 17 were moved to test_vimscript.vim
! let Xtest = 18
  
  
"-------------------------------------------------------------------------------
  " Test 18:  Interrupt (Ctrl-C pressed)                                        
    {{{1
***************
*** 1313,1452 ****
  
  Xcheck 41
  
! 
! 
"-------------------------------------------------------------------------------
! " Test 25:  Executing :finally clauses on normal control flow             {{{1
! "
! "         Control flow in a :try conditional should always fall through to its
! "         :finally clause.  A :finally clause of a :try conditional inside an
! "         inactive conditional should never be executed.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! function! F()
!     let loops = 3
!     XloopINIT 1 256
!     while loops > 0                           "     3:   2:       1:
!       Xloop 1                                 " X:  1 +  1*256 + 1*256*256
!       if loops >= 2
!           try
!               Xloop 2                         " X:  2 +  2*256
!               if loops == 2
!                   try
!                       Xloop 4                 " X:       4*256
!                   finally
!                       Xloop 8                 " X:       8*256
!                   endtry
!               endif
!           finally
!               Xloop 16                        " X: 16 + 16*256
!               if loops == 2
!                   try
!                       Xloop 32                " X:      32*256
!                   finally
!                       Xloop 64                " X:      64*256
!                   endtry
!               endif
!           endtry
!       endif
!       Xloop 128                               " X: 128 + 128*256 + 128*256*256
!       let loops = loops - 1
!       XloopNEXT
!     endwhile
!     Xpath 16777216                            " X: 16777216
! endfunction
! 
! if 1
!     try
!       Xpath 33554432                          " X: 33554432
!       call F()
!       Xpath 67108864                          " X: 67108864
!     finally
!       Xpath 134217728                         " X: 134217728
!     endtry
! else
!     try
!       Xpath 268435456                         " X: 0
!     finally
!       Xpath 536870912                         " X: 0
!     endtry
! endif
! 
! delfunction F
! 
! Xcheck 260177811
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 26:  Executing :finally clauses after :continue or :break          {{{1
! "
! "         For a :continue or :break dynamically enclosed in a :try/:endtry
! "         region inside the next surrounding :while/:endwhile, if the
! "         :continue/:break is before the :finally, the :finally clause is
! "         executed first.  If the :continue/:break is after the :finally, the
! "         :finally clause is broken (like an :if/:endif region).
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! try
!     let loops = 3
!     XloopINIT! 1 32
!     while loops > 0
!       XloopNEXT
!       try
!           try
!               if loops == 2                   "    3:   2:     1:
!                   Xloop 1                     " X:      1*32
!                   let loops = loops - 1
!                   continue
!               elseif loops == 1
!                   Xloop 2                     " X:             2*32*32
!                   break
!                   finish
!               endif
!               Xloop 4                         " X: 4
!           endtry
!       finally
!           Xloop 8                             " X: 8  + 8*32 + 8*32*32
!       endtry
!       Xloop 16                                " X: 16
!       let loops = loops - 1
!     endwhile
!     Xpath 32768                                       " X: 32768
! finally
!     Xpath 65536                                       " X: 65536
!     let loops = 3
!     XloopINIT 131072 16
!     while loops > 0
!       try
!       finally
!           try
!               if loops == 2
!                   Xloop 1                     " X: 131072*16
!                   let loops = loops - 1
!                   XloopNEXT
!                   continue
!               elseif loops == 1
!                   Xloop 2                     " X: 131072*2*16*16
!                   break
!                   finish
!               endif
!           endtry
!           Xloop 4                             " X: 131072*4
!       endtry
!       Xloop 8                                 " X: 131072*8
!       let loops = loops - 1
!       XloopNEXT
!     endwhile
!     Xpath 536870912                           " X: 536870912
! endtry
! Xpath 1073741824                              " X: 1073741824
! 
! unlet loops
! 
! Xcheck 1681500476
  
  
  
"-------------------------------------------------------------------------------
--- 1125,1132 ----
  
  Xcheck 41
  
! " Tests 25 and 26 were moved to test_trycatch.vim
! let Xtest = 27
  
  
  
"-------------------------------------------------------------------------------
***************
*** 1783,2034 ****
  
  Xcheck 190905173
  
! 
! 
"-------------------------------------------------------------------------------
! " Test 32:  Remembering the :return value on :finally                     {{{1
! "
! "         If a :finally clause is executed due to a :return specifying
! "         a value, this is the value visible to the caller if not overwritten
! "         by a new :return in the :finally clause.  A :return without a value
! "         in the :finally clause overwrites with value 0.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! function! F()
!     try
!       Xpath 1                                 " X: 1
!       try
!           Xpath 2                             " X: 2
!           return "ABCD"
!           Xpath 4                             " X: 0
!       finally
!           Xpath 8                             " X: 8
!       endtry
!       Xpath 16                                " X: 0
!     finally
!       Xpath 32                                " X: 32
!     endtry
!     Xpath 64                                  " X: 0
! endfunction
! 
! function! G()
!     try
!       Xpath 128                               " X: 128
!       return 8
!       Xpath 256                               " X: 0
!     finally
!       Xpath 512                               " X: 512
!       return 16 + strlen(F())
!       Xpath 1024                              " X: 0
!     endtry
!     Xpath 2048                                        " X: 0
! endfunction
! 
! function! H()
!     try
!       Xpath 4096                              " X: 4096
!       return 32
!       Xpath 8192                              " X: 0
!     finally
!       Xpath 16384                             " X: 16384
!       return
!       Xpath 32768                             " X: 0
!     endtry
!     Xpath 65536                                       " X: 0
! endfunction
! 
! function! I()
!     try
!       Xpath 131072                            " X: 131072
!     finally
!       Xpath 262144                            " X: 262144
!       return G() + H() + 64
!       Xpath 524288                            " X: 0
!     endtry
!     Xpath 1048576                             " X: 0
! endfunction
! 
! let retcode = I()
! Xpath 2097152                                 " X: 2097152
! 
! if retcode < 0
!     Xpath 4194304                             " X: 0
! endif
! if retcode % 4
!     Xpath 8388608                             " X: 0
! endif
! if (retcode/4) % 2
!     Xpath 16777216                            " X: 16777216
! endif
! if (retcode/8) % 2
!     Xpath 33554432                            " X: 0
! endif
! if (retcode/16) % 2
!     Xpath 67108864                            " X: 67108864
! endif
! if (retcode/32) % 2
!     Xpath 134217728                           " X: 0
! endif
! if (retcode/64) % 2
!     Xpath 268435456                           " X: 268435456
! endif
! if retcode/128
!     Xpath 536870912                           " X: 0
! endif
! 
! unlet retcode
! delfunction F
! delfunction G
! delfunction H
! delfunction I
! 
! Xcheck 354833067
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 33:  :return under :execute or user command and :finally               
    {{{1
! "
! "         A :return command may be executed under an ":execute" or from
! "         a user command.  Executing of :finally clauses and passing through
! "         the return code works also then.
! 
"-------------------------------------------------------------------------------
! XpathINIT
! 
! command! -nargs=? RETURN
!     \ try | return <args> | finally | return <args> * 2 | endtry
! 
! function! F()
!     try
!       RETURN 8
!       Xpath 1                                 " X: 0
!     finally
!       Xpath 2                                 " X: 2
!     endtry
!     Xpath 4                                   " X: 0
! endfunction
! 
! function! G()
!     try
!       RETURN 32
!       Xpath 8                                 " X: 0
!     finally
!       Xpath 16                                " X: 16
!       RETURN 128
!       Xpath 32                                " X: 0
!     endtry
!     Xpath 64                                  " X: 0
! endfunction
! 
! function! H()
!     try
!       execute "try | return 512 | finally | return 1024 | endtry"
!       Xpath 128                               " X: 0
!     finally
!       Xpath 256                               " X: 256
!     endtry
!     Xpath 512                                 " X: 0
! endfunction
! 
! function! I()
!     try
!       execute "try | return 2048 | finally | return 4096 | endtry"
!       Xpath 1024                              " X: 0
!     finally
!       Xpath 2048                              " X: 2048
!       execute "try | return 8192 | finally | return 16384 | endtry"
!       Xpath 4096                              " X: 0
!     endtry
!     Xpath 8192                                        " X: 0
! endfunction
! 
! function! J()
!     try
!       RETURN 32768
!       Xpath 16384                             " X: 0
!     finally
!       Xpath 32768                             " X: 32768
!       return
!       Xpath 65536                             " X: 0
!     endtry
!     Xpath 131072                              " X: 0
! endfunction
! 
! function! K()
!     try
!       execute "try | return 131072 | finally | return 262144 | endtry"
!       Xpath 262144                            " X: 0
!     finally
!       Xpath 524288                            " X: 524288
!       execute "try | return 524288 | finally | return | endtry"
!       Xpath 1048576                           " X: 0
!     endtry
!     Xpath 2097152                             " X: 0
! endfunction
! 
! function! L()
!     try
!       return
!       Xpath 4194304                           " X: 0
!     finally
!       Xpath 8388608                           " X: 8388608
!       RETURN 1048576
!       Xpath 16777216                          " X: 0
!     endtry
!     Xpath 33554432                            " X: 0
! endfunction
! 
! function! M()
!     try
!       return
!       Xpath 67108864                          " X: 0
!     finally
!       Xpath 134217728                         " X: 134217728
!       execute "try | return 4194304 | finally | return 8388608 | endtry"
!       Xpath 268435456                         " X: 0
!     endtry
!     Xpath 536870912                           " X: 0
! endfunction
! 
! function! N()
!     RETURN 16777216
! endfunction
! 
! function! O()
!     execute "try | return 67108864 | finally | return 134217728 | endtry"
! endfunction
! 
! let sum            = F() + G() + H()  + I()   + J() + K() + L()     + M()
! let expected = 16  + 256 + 1024 + 16384 + 0   + 0   + 2097152 + 8388608
! let sum            = sum      + N()      + O()
! let expected = expected + 33554432 + 134217728
! 
! if sum == expected
!     Xout "sum = " . sum . " (ok)"
! else
!     Xout "sum = " . sum . ", expected: " . expected
! endif
! 
! Xpath 1073741824                              " X: 1073741824
! 
! if sum != expected
!     " The Xpath command does not accept 2^31 (negative); add explicitly:
!     let Xpath = Xpath + 2147483648            " X: 0
! endif
! 
! unlet sum expected
! delfunction F
! delfunction G
! delfunction H
! delfunction I
! delfunction J
! delfunction K
! delfunction L
! delfunction M
! delfunction N
! delfunction O
! 
! Xcheck 1216907538
  
  
  
"-------------------------------------------------------------------------------
--- 1463,1470 ----
  
  Xcheck 190905173
  
! " Tests 32 and 33 were moved to test_trycatch.vim
! let Xtest = 34
  
  
  
"-------------------------------------------------------------------------------
***************
*** 2654,3296 ****
  
  Xcheck 357908480
  
! 
! 
"-------------------------------------------------------------------------------
! " Test 41:  Skipped :throw finding next command                               
    {{{1
! "
! "         A :throw in an inactive conditional must not hide a following
! "         command.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! function! F()
!     Xpath 1                                   " X: 1
!     if 0 | throw "never" | endif | Xpath 2    " X: 2
!     Xpath 4                                   " X: 4
! endfunction
! 
! function! G()
!     Xpath 8                                       " X: 8
!     while 0 | throw "never" | endwhile | Xpath 16   " X: 16
!     Xpath 32                                      " X: 32
! endfunction
! 
! function H()
!     Xpath 64                                              " X: 64
!     if 0 | try | throw "never" | endtry | endif | Xpath 128 " X: 128
!     Xpath 256                                             " X: 256
! endfunction
! 
! Xpath 512                                     " X: 512
! 
! try
!     Xpath 1024                                        " X: 1024
!     call F()
!     Xpath 2048                                        " X: 2048
! catch /.*/
!     Xpath 4096                                        " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! Xpath 8192                                    " X: 8192
! 
! try
!     Xpath 16384                                       " X: 16384
!     call G()
!     Xpath 32768                                       " X: 32768
! catch /.*/
!     Xpath 65536                                       " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! Xpath 131072                                  " X: 131072
! 
! try
!     Xpath 262144                              " X: 262144
!     call H()
!     Xpath 524288                              " X: 524288
! catch /.*/
!     Xpath 1048576                             " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! Xpath 2097152                                 " X: 2097152
! 
! delfunction F
! delfunction G
! delfunction H
! 
! Xcheck 3076095
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 42:  Catching number and string exceptions                         {{{1
! "
! "         When a number is thrown, it is converted to a string exception.
! "         Numbers and strings may be caught by specifying a regular exception
! "         as argument to the :catch command.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! try
! 
!     try
!       Xpath 1                                 " X: 1
!       throw 4711
!       Xpath 2                                 " X: 0
!     catch /4711/
!       Xpath 4                                 " X: 4
!     endtry
! 
!     try
!       Xpath 8                                 " X: 8
!       throw 4711
!       Xpath 16                                " X: 0
!     catch /^4711$/
!       Xpath 32                                " X: 32
!     endtry
! 
!     try
!       Xpath 64                                " X: 64
!       throw 4711
!       Xpath 128                               " X: 0
!     catch /\d/
!       Xpath 256                               " X: 256
!     endtry
! 
!     try
!       Xpath 512                               " X: 512
!       throw 4711
!       Xpath 1024                              " X: 0
!     catch /^\d\+$/
!       Xpath 2048                              " X: 2048
!     endtry
! 
!     try
!       Xpath 4096                              " X: 4096
!       throw "arrgh"
!       Xpath 8192                              " X: 0
!     catch /arrgh/
!       Xpath 16384                             " X: 16384
!     endtry
! 
!     try
!       Xpath 32768                             " X: 32768
!       throw "arrgh"
!       Xpath 65536                             " X: 0
!     catch /^arrgh$/
!       Xpath 131072                            " X: 131072
!     endtry
! 
!     try
!       Xpath 262144                            " X: 262144
!       throw "arrgh"
!       Xpath 524288                            " X: 0
!     catch /\l/
!       Xpath 1048576                           " X: 1048576
!     endtry
! 
!     try
!       Xpath 2097152                           " X: 2097152
!       throw "arrgh"
!       Xpath 4194304                           " X: 0
!     catch /^\l\+$/
!       Xpath 8388608                           " X: 8388608
!     endtry
! 
!     try
!       try
!           Xpath 16777216                      " X: 16777216
!           throw "ARRGH"
!           Xpath 33554432                      " X: 0
!       catch /^arrgh$/
!           Xpath 67108864                      " X: 0
!       endtry
!     catch /^\carrgh$/
!       Xpath 134217728                         " X: 134217728
!     endtry
! 
!     try
!       Xpath 268435456                         " X: 268435456
!       throw ""
!       Xpath 536870912                         " X: 0
!     catch /^$/
!       Xpath 1073741824                        " X: 1073741824
!     endtry
! 
! catch /.*/
!     " The Xpath command does not accept 2^31 (negative); add explicitly:
!     let Xpath = Xpath + 2147483648            " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! Xcheck 1505155949
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 43:  Selecting the correct :catch clause                               
    {{{1
! "
! "         When an exception is thrown and there are multiple :catch clauses,
! "         the first matching one is taken.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! XloopINIT 1 1024
! let loops = 3
! while loops > 0
!     try
!       if loops == 3
!           Xloop 1                             " X: 1
!           throw "a"
!           Xloop 2                             " X: 0
!       elseif loops == 2
!           Xloop 4                             " X: 4*1024
!           throw "ab"
!           Xloop 8                             " X: 0
!       elseif loops == 1
!           Xloop 16                            " X: 16*1024*1024
!           throw "abc"
!           Xloop 32                            " X: 0
!       endif
!     catch /abc/
!       Xloop 64                                " X: 64*1024*1024
!     catch /ab/
!       Xloop 128                               " X: 128*1024
!     catch /.*/
!       Xloop 256                               " X: 256
!     catch /a/
!       Xloop 512                               " X: 0
!     endtry
! 
!     let loops = loops - 1
!     XloopNEXT
! endwhile
! Xpath 1073741824                              " X: 1073741824
! 
! unlet loops
! 
! Xcheck 1157763329
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 44:  Missing or empty :catch patterns                              {{{1
! "
! "         A missing or empty :catch pattern means the same as /.*/, that is,
! "         catches everything.  To catch only empty exceptions, /^$/ must be
! "         used.  A :catch with missing, empty, or /.*/ argument also works
! "         when followed by another command separated by a bar on the same
! "         line.  :catch patterns cannot be specified between ||.  But other
! "         pattern separators can be used instead of //.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! try
!     try
!       Xpath 1                                 " X: 1
!       throw ""
!     catch /^$/
!       Xpath 2                                 " X: 2
!     endtry
! 
!     try
!       Xpath 4                                 " X: 4
!       throw ""
!     catch /.*/
!       Xpath 8                                 " X: 8
!     endtry
! 
!     try
!       Xpath 16                                " X: 16
!       throw ""
!     catch //
!       Xpath 32                                " X: 32
!     endtry
! 
!     try
!       Xpath 64                                " X: 64
!       throw ""
!     catch
!       Xpath 128                               " X: 128
!     endtry
! 
!     try
!       Xpath 256                               " X: 256
!       throw "oops"
!     catch /^$/
!       Xpath 512                               " X: 0
!     catch /.*/
!       Xpath 1024                              " X: 1024
!     endtry
! 
!     try
!       Xpath 2048                              " X: 2048
!       throw "arrgh"
!     catch /^$/
!       Xpath 4096                              " X: 0
!     catch //
!       Xpath 8192                              " X: 8192
!     endtry
! 
!     try
!       Xpath 16384                             " X: 16384
!       throw "brrr"
!     catch /^$/
!       Xpath 32768                             " X: 0
!     catch
!       Xpath 65536                             " X: 65536
!     endtry
! 
!     try | Xpath 131072 | throw "x" | catch /.*/ | Xpath 262144 | endtry
!                                               " X: 131072 + 262144
! 
!     try | Xpath 524288 | throw "y" | catch // | Xpath 1048576 | endtry
!                                               " X: 524288 + 1048576
! 
!     while 1
!       try
!           let caught = 0
!           let v:errmsg = ""
!           " Extra try level:  if ":catch" without arguments below raises
!           " a syntax error because it misinterprets the "Xpath" as a pattern,
!           " let it be caught by the ":catch /.*/" below.
!           try
!               try | Xpath 2097152 | throw "z" | catch | Xpath 4194304 | :
!               endtry                          " X: 2097152 + 4194304
!           endtry
!       catch /.*/
!           let caught = 1
!           Xout v:exception "in" v:throwpoint
!       finally
!           if $VIMNOERRTHROW && v:errmsg != ""
!               Xout v:errmsg
!           endif
!           if caught || $VIMNOERRTHROW && v:errmsg != ""
!               Xpath 8388608                           " X: 0
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
! 
!     let cologne = 4711
!     try
!       try
!           Xpath 16777216                      " X: 16777216
!           throw "throw cologne"
!       " Next lines catches all and throws 4711:
!       catch |throw cologne|
!           Xpath 33554432                      " X: 0
!       endtry
!     catch /4711/
!       Xpath 67108864                          " X: 67108864
!     endtry
! 
!     try
!       Xpath 134217728                         " X: 134217728
!       throw "plus"
!     catch +plus+
!       Xpath 268435456                         " X: 268435456
!     endtry
! 
!     Xpath 536870912                           " X: 536870912
! catch /.*/
!     Xpath 1073741824                          " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! unlet! caught cologne
! 
! Xcheck 1031761407
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 45:  Catching exceptions from nested :try blocks                       
    {{{1
! "
! "         When :try blocks are nested, an exception is caught by the innermost
! "         try conditional that has a matching :catch clause.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! XloopINIT 1 1024
! let loops = 3
! while loops > 0
!     try
!       try
!           try
!               try
!                   if loops == 3
!                       Xloop 1                 " X: 1
!                       throw "a"
!                       Xloop 2                 " X: 0
!                   elseif loops == 2
!                       Xloop 4                 " X: 4*1024
!                       throw "ab"
!                       Xloop 8                 " X: 0
!                   elseif loops == 1
!                       Xloop 16                " X: 16*1024*1024
!                       throw "abc"
!                       Xloop 32                " X: 0
!                   endif
!               catch /abc/
!                   Xloop 64                    " X: 64*1024*1024
!               endtry
!           catch /ab/
!               Xloop 128                       " X: 128*1024
!           endtry
!       catch /.*/
!           Xloop 256                           " X: 256
!       endtry
!     catch /a/
!       Xloop 512                               " X: 0
!     endtry
! 
!     let loops = loops - 1
!     XloopNEXT
! endwhile
! Xpath 1073741824                              " X: 1073741824
! 
! unlet loops
! 
! Xcheck 1157763329
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 46:  Executing :finally after a :throw in nested :try              {{{1
! "
! "         When an exception is thrown from within nested :try blocks, the
! "         :finally clauses of the non-catching try conditionals should be
! "         executed before the matching :catch of the next surrounding :try
! "         gets the control.  If this also has a :finally clause, it is
! "         executed afterwards.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let sum = 0
! 
! try
!     Xpath 1                                   " X: 1
!     try
!       Xpath 2                                 " X: 2
!       try
!           Xpath 4                             " X: 4
!           try
!               Xpath 8                         " X: 8
!               throw "ABC"
!               Xpath 16                        " X: 0
!           catch /xyz/
!               Xpath 32                        " X: 0
!           finally
!               Xpath 64                        " X: 64
!               if sum != 0
!                   Xpath 128                   " X: 0
!               endif
!               let sum = sum + 1
!           endtry
!           Xpath 256                           " X: 0
!       catch /123/
!           Xpath 512                           " X: 0
!       catch /321/
!           Xpath 1024                          " X: 0
!       finally
!           Xpath 2048                          " X: 2048
!           if sum != 1
!               Xpath 4096                      " X: 0
!           endif
!           let sum = sum + 2
!       endtry
!       Xpath 8192                              " X: 0
!     finally
!       Xpath 16384                             " X: 16384
!       if sum != 3
!           Xpath 32768                         " X: 0
!       endif
!       let sum = sum + 4
!     endtry
!     Xpath 65536                                       " X: 0
! catch /ABC/
!     Xpath 131072                              " X: 131072
!     if sum != 7
!       Xpath 262144                            " X: 0
!     endif
!     let sum = sum + 8
! finally
!     Xpath 524288                              " X: 524288
!     if sum != 15
!       Xpath 1048576                           " X: 0
!     endif
!     let sum = sum + 16
! endtry
! Xpath 65536                                   " X: 65536
! if sum != 31
!     Xpath 131072                              " X: 0
! endif
! 
! unlet sum
! 
! Xcheck 739407
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 47:  Throwing exceptions from a :catch clause                      {{{1
! "
! "         When an exception is thrown from a :catch clause, it should not be
! "         caught by a :catch of the same :try conditional.  After executing
! "         the :finally clause (if present), surrounding try conditionals
! "         should be checked for a matching :catch.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! Xpath 1                                               " X: 1
! try
!     Xpath 2                                   " X: 2
!     try
!       Xpath 4                                 " X: 4
!       try
!           Xpath 8                             " X: 8
!           throw "x1"
!           Xpath 16                            " X: 0
!       catch /x1/
!           Xpath 32                            " X: 32
!           try
!               Xpath 64                        " X: 64
!               throw "x2"
!               Xpath 128                       " X: 0
!           catch /x1/
!               Xpath 256                       " X: 0
!           catch /x2/
!               Xpath 512                       " X: 512
!               try
!                   Xpath 1024                  " X: 1024
!                   throw "x3"
!                   Xpath 2048                  " X: 0
!               catch /x1/
!                   Xpath 4096                  " X: 0
!               catch /x2/
!                   Xpath 8192                  " X: 0
!               finally
!                   Xpath 16384                 " X: 16384
!               endtry
!               Xpath 32768                     " X: 0
!           catch /x3/
!               Xpath 65536                     " X: 0
!           endtry
!           Xpath 131072                        " X: 0
!       catch /x1/
!           Xpath 262144                        " X: 0
!       catch /x2/
!           Xpath 524288                        " X: 0
!       catch /x3/
!           Xpath 1048576                       " X: 0
!       finally
!           Xpath 2097152                       " X: 2097152
!       endtry
!       Xpath 4194304                           " X: 0
!     catch /x1/
!       Xpath 8388608                           " X: 0
!     catch /x2/
!       Xpath 16777216                          " X: 0
!     catch /x3/
!       Xpath 33554432                          " X: 33554432
!     endtry
!     Xpath 67108864                            " X: 67108864
! catch /.*/
!     Xpath 134217728                           " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! Xpath 268435456                                       " X: 268435456
! 
! Xcheck 371213935
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 48:  Throwing exceptions from a :finally clause                        
    {{{1
! "
! "         When an exception is thrown from a :finally clause, it should not be
! "         caught by a :catch of the same :try conditional.  Surrounding try
! "         conditionals should be checked for a matching :catch.  A previously
! "         thrown exception is discarded.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! try
! 
!     try
!       try
!           Xpath 1                             " X: 1
!       catch /x1/
!           Xpath 2                             " X: 0
!       finally
!           Xpath 4                             " X: 4
!           throw "x1"
!           Xpath 8                             " X: 0
!       endtry
!       Xpath 16                                " X: 0
!     catch /x1/
!       Xpath 32                                " X: 32
!     endtry
!     Xpath 64                                  " X: 64
! 
!     try
!       try
!           Xpath 128                           " X: 128
!           throw "x2"
!           Xpath 256                           " X: 0
!       catch /x2/
!           Xpath 512                           " X: 512
!       catch /x3/
!           Xpath 1024                          " X: 0
!       finally
!           Xpath 2048                          " X: 2048
!           throw "x3"
!           Xpath 4096                          " X: 0
!       endtry
!       Xpath 8192                              " X: 0
!     catch /x2/
!       Xpath 16384                             " X: 0
!     catch /x3/
!       Xpath 32768                             " X: 32768
!     endtry
!     Xpath 65536                                       " X: 65536
! 
!     try
!       try
!           try
!               Xpath 131072                    " X: 131072
!               throw "x4"
!               Xpath 262144                    " X: 0
!           catch /x5/
!               Xpath 524288                    " X: 0
!           finally
!               Xpath 1048576                   " X: 1048576
!               throw "x5"      " discards "x4"
!               Xpath 2097152                   " X: 0
!           endtry
!           Xpath 4194304                       " X: 0
!       catch /x4/
!           Xpath 8388608                       " X: 0
!       finally
!           Xpath 16777216                      " X: 16777216
!       endtry
!       Xpath 33554432                          " X: 0
!     catch /x5/
!       Xpath 67108864                          " X: 67108864
!     endtry
!     Xpath 134217728                           " X: 134217728
! 
! catch /.*/
!     Xpath 268435456                           " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! Xpath 536870912                                       " X: 536870912
! 
! Xcheck 756255461
  
  
  
"-------------------------------------------------------------------------------
--- 2090,2097 ----
  
  Xcheck 357908480
  
! " Tests 41 to 48 were moved to test_trycatch.vim
! let Xtest = 49
  
  
  
"-------------------------------------------------------------------------------
***************
*** 3443,3566 ****
  
  Xcheck 363550045
  
! 
! 
"-------------------------------------------------------------------------------
! " Test 51:  Throwing exceptions across :execute and user commands         {{{1
! "
! "         A :throw command may be executed under an ":execute" or from
! "         a user command.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! command! -nargs=? THROW1    throw <args> | throw 1
! command! -nargs=? THROW2    try | throw <args> | endtry | throw 2
! command! -nargs=? THROW3    try | throw 3 | catch /3/ | throw <args> | endtry
! command! -nargs=? THROW4    try | throw 4 | finally   | throw <args> | endtry
! 
! try
! 
!     try
!       try
!           Xpath 1                             " X: 1
!           THROW1 "A"
!       catch /A/
!           Xpath 2                             " X: 2
!       endtry
!     catch /1/
!       Xpath 4                                 " X: 0
!     endtry
! 
!     try
!       try
!           Xpath 8                             " X: 8
!           THROW2 "B"
!       catch /B/
!           Xpath 16                            " X: 16
!       endtry
!     catch /2/
!       Xpath 32                                " X: 0
!     endtry
! 
!     try
!       try
!           Xpath 64                            " X: 64
!           THROW3 "C"
!       catch /C/
!           Xpath 128                           " X: 128
!       endtry
!     catch /3/
!       Xpath 256                               " X: 0
!     endtry
! 
!     try
!       try
!           Xpath 512                           " X: 512
!           THROW4 "D"
!       catch /D/
!           Xpath 1024                          " X: 1024
!       endtry
!     catch /4/
!       Xpath 2048                              " X: 0
!     endtry
! 
!     try
!       try
!           Xpath 4096                          " X: 4096
!           execute 'throw "E" | throw 5'
!       catch /E/
!           Xpath 8192                          " X: 8192
!       endtry
!     catch /5/
!       Xpath 16384                             " X: 0
!     endtry
! 
!     try
!       try
!           Xpath 32768                         " X: 32768
!           execute 'try | throw "F" | endtry | throw 6'
!       catch /F/
!           Xpath 65536                         " X: 65536
!       endtry
!     catch /6/
!       Xpath 131072                            " X: 0
!     endtry
! 
!     try
!       try
!           Xpath 262144                        " X: 262144
!           execute'try | throw 7 | catch /7/ | throw "G" | endtry'
!       catch /G/
!           Xpath 524288                        " X: 524288
!       endtry
!     catch /7/
!       Xpath 1048576                           " X: 0
!     endtry
! 
!     try
!       try
!           Xpath 2097152                       " X: 2097152
!           execute 'try | throw 8 | finally   | throw "H" | endtry'
!       catch /H/
!           Xpath 4194304                       " X: 4194304
!       endtry
!     catch /8/
!       Xpath 8388608                           " X: 0
!     endtry
! 
! catch /.*/
!     Xpath 16777216                            " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! Xpath 33554432                                        " X: 33554432
! 
! delcommand THROW1
! delcommand THROW2
! delcommand THROW3
! delcommand THROW4
! 
! Xcheck 40744667
  
  
  
"-------------------------------------------------------------------------------
--- 2244,2251 ----
  
  Xcheck 363550045
  
! " Test 51 was moved to test_trycatch.vim
! let Xtest = 52
  
  
  
"-------------------------------------------------------------------------------
***************
*** 6227,7180 ****
  
  Xcheck 212514423
  
! 
! 
"-------------------------------------------------------------------------------
! " Test 69:  :throw across :if, :elseif, :while                                
    {{{1
! "
! "         On an :if, :elseif, or :while command, an exception might be thrown
! "         during evaluation of the expression to test.  The exception can be
! "         caught by the script.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! XloopINIT! 1 2
! 
! function! THROW(x)
!     XloopNEXT
!     Xloop 1                                   " X: 1 + 2 + 4
!     throw a:x
! endfunction
! 
! try
! 
!     try
!       Xpath 8                                 " X: 8
!       if 4711 == THROW("if") + 111
!           Xpath 16                            " X: 0
!       else
!           Xpath 32                            " X: 0
!       endif
!       Xpath 64                                " X: 0
!     catch /^if$/
!       Xpath 128                               " X: 128
!     catch /.*/
!       Xpath 256                               " X: 0
!       Xout "if:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 512                               " X: 512
!       if 4711 == 4 + 7 + 1 + 1
!           Xpath 1024                          " X: 0
!       elseif 4711 == THROW("elseif") + 222
!           Xpath 2048                          " X: 0
!       else
!           Xpath 4096                          " X: 0
!       endif
!       Xpath 8192                              " X: 0
!     catch /^elseif$/
!       Xpath 16384                             " X: 16384
!     catch /.*/
!       Xpath 32768                             " X: 0
!       Xout "elseif:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 65536                             " X: 65536
!       while 4711 == THROW("while") + 4711
!           Xpath 131072                        " X: 0
!           break
!       endwhile
!       Xpath 262144                            " X: 0
!     catch /^while$/
!       Xpath 524288                            " X: 524288
!     catch /.*/
!       Xpath 1048576                           " X: 0
!       Xout "while:" v:exception "in" v:throwpoint
!     endtry
! 
! catch /^0$/       " default return value
!     Xpath 2097152                             " X: 0
!     Xout v:throwpoint
! catch /.*/
!     Xout v:exception "in" v:throwpoint
!     Xpath 4194304                             " X: 0
! endtry
! 
! Xpath 8388608                                 " X: 8388608
! 
! delfunction THROW
! 
! Xcheck 8995471
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 70:  :throw across :return or :throw                               {{{1
! "
! "         On a :return or :throw command, an exception might be thrown during
! "         evaluation of the expression to return or throw, respectively.  The
! "         exception can be caught by the script.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let taken = ""
! 
! function! THROW(x, n)
!     let g:taken = g:taken . "T" . a:n
!     throw a:x
! endfunction
! 
! function! F(x, y, n)
!     let g:taken = g:taken . "F" . a:n
!     return a:x + THROW(a:y, a:n)
! endfunction
! 
! function! G(x, y, n)
!     let g:taken = g:taken . "G" . a:n
!     throw a:x . THROW(a:y, a:n)
!     return a:x
! endfunction
! 
! try
!     try
!       Xpath 1                                 " X: 1
!       call F(4711, "return", 1)
!       Xpath 2                                 " X: 0
!     catch /^return$/
!       Xpath 4                                 " X: 4
!     catch /.*/
!       Xpath 8                                 " X: 0
!       Xout "return:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 16                                " X: 16
!       let var = F(4712, "return-var", 2)
!       Xpath 32                                " X: 0
!     catch /^return-var$/
!       Xpath 64                                " X: 64
!     catch /.*/
!       Xpath 128                               " X: 0
!       Xout "return-var:" v:exception "in" v:throwpoint
!     finally
!       unlet! var
!     endtry
! 
!     try
!       Xpath 256                               " X: 256
!       throw "except1" . THROW("throw1", 3)
!       Xpath 512                               " X: 0
!     catch /^except1/
!       Xpath 1024                              " X: 0
!     catch /^throw1$/
!       Xpath 2048                              " X: 2048
!     catch /.*/
!       Xpath 4096                              " X: 0
!       Xout "throw1:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 8192                              " X: 8192
!       call G("except2", "throw2", 4)
!       Xpath 16384                             " X: 0
!     catch /^except2/
!       Xpath 32768                             " X: 0
!     catch /^throw2$/
!       Xpath 65536                             " X: 65536
!     catch /.*/
!       Xpath 131072                            " X: 0
!       Xout "throw2:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 262144                            " X: 262144
!       let var = G("except3", "throw3", 5)
!       Xpath 524288                            " X: 0
!     catch /^except3/
!       Xpath 1048576                           " X: 0
!     catch /^throw3$/
!       Xpath 2097152                           " X: 2097152
!     catch /.*/
!       Xpath 4194304                           " X: 0
!       Xout "throw3:" v:exception "in" v:throwpoint
!     finally
!       unlet! var
!     endtry
! 
!     let expected = "F1T1F2T2T3G4T4G5T5"
!     if taken != expected
!       Xpath 8388608                           " X: 0
!       Xout "'taken' is" taken "instead of" expected
!     endif
! 
! catch /^0$/       " default return value
!     Xpath 16777216                            " X: 0
!     Xout v:throwpoint
! catch /.*/
!     Xpath 33554432                            " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! Xpath 67108864                                        " X: 67108864
! 
! unlet taken expected
! delfunction THROW
! delfunction F
! delfunction G
! 
! Xcheck 69544277
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 71:  :throw across :echo variants and :execute                     {{{1
! "
! "         On an :echo, :echon, :echomsg, :echoerr, or :execute command, an
! "         exception might be thrown during evaluation of the arguments to
! "         be displayed or executed as a command, respectively.  Any following
! "         arguments are not evaluated, then.  The exception can be caught by
! "         the script.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let taken = ""
! 
! function! THROW(x, n)
!     let g:taken = g:taken . "T" . a:n
!     throw a:x
! endfunction
! 
! function! F(n)
!     let g:taken = g:taken . "F" . a:n
!     return "F" . a:n
! endfunction
! 
! try
!     try
!       Xpath 1                                 " X: 1
!       echo "echo" . THROW("echo-except", 1) F(1)
!       Xpath 2                                 " X: 0
!     catch /^echo-except$/
!       Xpath 4                                 " X: 4
!     catch /.*/
!       Xpath 8                                 " X: 0
!       Xout "echo:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 16                                " X: 16
!       echon "echon" . THROW("echon-except", 2) F(2)
!       Xpath 32                                " X: 0
!     catch /^echon-except$/
!       Xpath 64                                " X: 64
!     catch /.*/
!       Xpath 128                               " X: 0
!       Xout "echon:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 256                               " X: 256
!       echomsg "echomsg" . THROW("echomsg-except", 3) F(3)
!       Xpath 512                               " X: 0
!     catch /^echomsg-except$/
!       Xpath 1024                              " X: 1024
!     catch /.*/
!       Xpath 2048                              " X: 0
!       Xout "echomsg:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 4096                              " X: 4096
!       echoerr "echoerr" . THROW("echoerr-except", 4) F(4)
!       Xpath 8192                              " X: 0
!     catch /^echoerr-except$/
!       Xpath 16384                             " X: 16384
!     catch /Vim/
!       Xpath 32768                             " X: 0
!     catch /echoerr/
!       Xpath 65536                             " X: 0
!     catch /.*/
!       Xpath 131072                            " X: 0
!       Xout "echoerr:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 262144                            " X: 262144
!       execute "echo 'execute" . THROW("execute-except", 5) F(5) "'"
!       Xpath 524288                            " X: 0
!     catch /^execute-except$/
!       Xpath 1048576                           " X: 1048576
!     catch /.*/
!       Xpath 2097152                           " X: 0
!       Xout "execute:" v:exception "in" v:throwpoint
!     endtry
! 
!     let expected = "T1T2T3T4T5"
!     if taken != expected
!       Xpath 4194304                           " X: 0
!       Xout "'taken' is" taken "instead of" expected
!     endif
! 
! catch /^0$/       " default return value
!     Xpath 8388608                             " X: 0
!     Xout v:throwpoint
! catch /.*/
!     Xpath 16777216                            " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! Xpath 33554432                                        " X: 33554432
! 
! unlet taken expected
! delfunction THROW
! delfunction F
! 
! Xcheck 34886997
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 72:  :throw across :let or :unlet                                  {{{1
! "
! "         On a :let command, an exception might be thrown during evaluation
! "         of the expression to assign.  On an :let or :unlet command, the
! "         evaluation of the name of the variable to be assigned or list or
! "         deleted, respectively, may throw an exception.  Any following
! "         arguments are not evaluated, then.  The exception can be caught by
! "         the script.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let throwcount = 0
! 
! function! THROW(x)
!     let g:throwcount = g:throwcount + 1
!     throw a:x
! endfunction
! 
! try
!     try
!       let $VAR = "old_value"
!       Xpath 1                                 " X: 1
!       let $VAR = "let(" . THROW("var") . ")"
!       Xpath 2                                 " X: 0
!     catch /^var$/
!       Xpath 4                                 " X: 4
!     finally
!       if $VAR != "old_value"
!           Xpath 8                             " X: 0
!       endif
!     endtry
! 
!     try
!       let @a = "old_value"
!       Xpath 16                                " X: 16
!       let @a = "let(" . THROW("reg") . ")"
!       Xpath 32                                " X: 0
!     catch /^reg$/
!       try
!           Xpath 64                            " X: 64
!           let @A = "let(" . THROW("REG") . ")"
!           Xpath 128                           " X: 0
!       catch /^REG$/
!           Xpath 256                           " X: 256
!       endtry
!     finally
!       if @a != "old_value"
!           Xpath 512                           " X: 0
!       endif
!       if @A != "old_value"
!           Xpath 1024                          " X: 0
!       endif
!     endtry
! 
!     try
!       let saved_gpath = &g:path
!       let saved_lpath = &l:path
!       Xpath 2048                              " X: 2048
!       let &path = "let(" . THROW("opt") . ")"
!       Xpath 4096                              " X: 0
!     catch /^opt$/
!       try
!           Xpath 8192                          " X: 8192
!           let &g:path = "let(" . THROW("gopt") . ")"
!           Xpath 16384                         " X: 0
!       catch /^gopt$/
!           try
!               Xpath 32768                     " X: 32768
!               let &l:path = "let(" . THROW("lopt") . ")"
!               Xpath 65536                     " X: 0
!           catch /^lopt$/
!               Xpath 131072                    " X: 131072
!           endtry
!       endtry
!     finally
!       if &g:path != saved_gpath || &l:path != saved_lpath
!           Xpath 262144                        " X: 0
!       endif
!       let &g:path = saved_gpath
!       let &l:path = saved_lpath
!     endtry
! 
!     unlet! var1 var2 var3
! 
!     try
!       Xpath 524288                            " X: 524288
!       let var1 = "let(" . THROW("var1") . ")"
!       Xpath 1048576                           " X: 0
!     catch /^var1$/
!       Xpath 2097152                           " X: 2097152
!     finally
!       if exists("var1")
!           Xpath 4194304                       " X: 0
!       endif
!     endtry
! 
!     try
!       let var2 = "old_value"
!       Xpath 8388608                           " X: 8388608
!       let var2 = "let(" . THROW("var2"). ")"
!       Xpath 16777216                          " X: 0
!     catch /^var2$/
!       Xpath 33554432                          " X: 33554432
!     finally
!       if var2 != "old_value"
!           Xpath 67108864                      " X: 0
!       endif
!     endtry
! 
!     try
!       Xpath 134217728                         " X: 134217728
!       let var{THROW("var3")} = 4711
!       Xpath 268435456                         " X: 0
!     catch /^var3$/
!       Xpath 536870912                         " X: 536870912
!     endtry
! 
!     let addpath = ""
! 
!     function ADDPATH(p)
!       let g:addpath = g:addpath . a:p
!     endfunction
! 
!     try
!       call ADDPATH("T1")
!       let var{THROW("var4")} var{ADDPATH("T2")} | call ADDPATH("T3")
!       call ADDPATH("T4")
!     catch /^var4$/
!       call ADDPATH("T5")
!     endtry
! 
!     try
!       call ADDPATH("T6")
!       unlet var{THROW("var5")} var{ADDPATH("T7")} | call ADDPATH("T8")
!       call ADDPATH("T9")
!     catch /^var5$/
!       call ADDPATH("T10")
!     endtry
! 
!     if addpath != "T1T5T6T10" || throwcount != 11
!       throw "addpath: " . addpath . ", throwcount: " . throwcount
!     endif
! 
!     Xpath 1073741824                          " X: 1073741824
! 
! catch /.*/
!     " The Xpath command does not accept 2^31 (negative); add explicitly:
!     let Xpath = Xpath + 2147483648            " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! unlet! var1 var2 var3 addpath throwcount
! delfunction THROW
! 
! Xcheck 1789569365
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 73:  :throw across :function, :delfunction                         {{{1
! "
! "         The :function and :delfunction commands may cause an expression
! "         specified in braces to be evaluated.  During evaluation, an
! "         exception might be thrown.  The exception can be caught by the
! "         script.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let taken = ""
! 
! function! THROW(x, n)
!     let g:taken = g:taken . "T" . a:n
!     throw a:x
! endfunction
! 
! function! EXPR(x, n)
!     let g:taken = g:taken . "E" . a:n
!     if a:n % 2 == 0
!       call THROW(a:x, a:n)
!     endif
!     return 2 - a:n % 2
! endfunction
! 
! try
!     try
!       " Define function.
!       Xpath 1                                 " X: 1
!       function! F0()
!       endfunction
!       Xpath 2                                 " X: 2
!       function! F{EXPR("function-def-ok", 1)}()
!       endfunction
!       Xpath 4                                 " X: 4
!       function! F{EXPR("function-def", 2)}()
!       endfunction
!       Xpath 8                                 " X: 0
!     catch /^function-def-ok$/
!       Xpath 16                                " X: 0
!     catch /^function-def$/
!       Xpath 32                                " X: 32
!     catch /.*/
!       Xpath 64                                " X: 0
!       Xout "def:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       " List function.
!       Xpath 128                               " X: 128
!       function F0
!       Xpath 256                               " X: 256
!       function F{EXPR("function-lst-ok", 3)}
!       Xpath 512                               " X: 512
!       function F{EXPR("function-lst", 4)}
!       Xpath 1024                              " X: 0
!     catch /^function-lst-ok$/
!       Xpath 2048                              " X: 0
!     catch /^function-lst$/
!       Xpath 4096                              " X: 4096
!     catch /.*/
!       Xpath 8192                              " X: 0
!       Xout "lst:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       " Delete function
!       Xpath 16384                             " X: 16384
!       delfunction F0
!       Xpath 32768                             " X: 32768
!       delfunction F{EXPR("function-del-ok", 5)}
!       Xpath 65536                             " X: 65536
!       delfunction F{EXPR("function-del", 6)}
!       Xpath 131072                            " X: 0
!     catch /^function-del-ok$/
!       Xpath 262144                            " X: 0
!     catch /^function-del$/
!       Xpath 524288                            " X: 524288
!     catch /.*/
!       Xpath 1048576                           " X: 0
!       Xout "del:" v:exception "in" v:throwpoint
!     endtry
! 
!     let expected = "E1E2T2E3E4T4E5E6T6"
!     if taken != expected
!       Xpath 2097152                           " X: 0
!       Xout "'taken' is" taken "instead of" expected
!     endif
! 
! catch /.*/
!     Xpath 4194304                             " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! Xpath 8388608                                 " X: 8388608
! 
! unlet taken expected
! delfunction THROW
! delfunction EXPR
! 
! Xcheck 9032615
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 74:  :throw across builtin functions and commands                  {{{1
! "
! "         Some functions like exists(), searchpair() take expression
! "         arguments, other functions or commands like substitute() or
! "         :substitute cause an expression (specified in the regular
! "         expression) to be evaluated.  During evaluation an exception
! "         might be thrown.  The exception can be caught by the script.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! let taken = ""
! 
! function! THROW(x, n)
!     let g:taken = g:taken . "T" . a:n
!     throw a:x
! endfunction
! 
! function! EXPR(x, n)
!     let g:taken = g:taken . "E" . a:n
!     call THROW(a:x . a:n, a:n)
!     return "EXPR"
! endfunction
! 
! function! SKIP(x, n)
!     let g:taken = g:taken . "S" . a:n . "(" . line(".")
!     let theline = getline(".")
!     if theline =~ "skip"
!       let g:taken = g:taken . "s)"
!       return 1
!     elseif theline =~ "throw"
!       let g:taken = g:taken . "t)"
!       call THROW(a:x . a:n, a:n)
!     else
!       let g:taken = g:taken . ")"
!       return 0
!     endif
! endfunction
! 
! function! SUBST(x, n)
!     let g:taken = g:taken . "U" . a:n . "(" . line(".")
!     let theline = getline(".")
!     if theline =~ "not"           " SUBST() should not be called for this line
!       let g:taken = g:taken . "n)"
!       call THROW(a:x . a:n, a:n)
!     elseif theline =~ "throw"
!       let g:taken = g:taken . "t)"
!       call THROW(a:x . a:n, a:n)
!     else
!       let g:taken = g:taken . ")"
!       return "replaced"
!     endif
! endfunction
! 
! try
!     try
!       Xpath 1                                 " X: 1
!       let result = exists('*{EXPR("exists", 1)}')
!       Xpath 2                                 " X: 0
!     catch /^exists1$/
!       Xpath 4                                 " X: 4
!       try
!           let result = exists('{EXPR("exists", 2)}')
!           Xpath 8                             " X: 0
!       catch /^exists2$/
!           Xpath 16                            " X: 16
!       catch /.*/
!           Xpath 32                            " X: 0
!           Xout "exists2:" v:exception "in" v:throwpoint
!       endtry
!     catch /.*/
!       Xpath 64                                " X: 0
!       Xout "exists1:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       let file = tempname()
!       exec "edit" file
!       insert
! begin
!     xx
! middle 3
!     xx
! middle 5 skip
!     xx
! middle 7 throw
!     xx
! end
! .
!       normal! gg
!       Xpath 128                               " X: 128
!       let result =
!           \ searchpair("begin", "middle", "end", '', 'SKIP("searchpair", 3)')
!       Xpath 256                               " X: 256
!       let result =
!           \ searchpair("begin", "middle", "end", '', 'SKIP("searchpair", 4)')
!       Xpath 512                               " X: 0
!       let result =
!           \ searchpair("begin", "middle", "end", '', 'SKIP("searchpair", 5)')
!       Xpath 1024                              " X: 0
!     catch /^searchpair[35]$/
!       Xpath 2048                              " X: 0
!     catch /^searchpair4$/
!       Xpath 4096                              " X: 4096
!     catch /.*/
!       Xpath 8192                              " X: 0
!       Xout "searchpair:" v:exception "in" v:throwpoint
!     finally
!       bwipeout!
!       call delete(file)
!     endtry
! 
!     try
!       let file = tempname()
!       exec "edit" file
!       insert
! subst 1
! subst 2
! not
! subst 4
! subst throw
! subst 6
! .
!       normal! gg
!       Xpath 16384                             " X: 16384
!       1,2substitute/subst/\=SUBST("substitute", 6)/
!       try
!           Xpath 32768                         " X: 32768
!           try
!               let v:errmsg = ""
!               3substitute/subst/\=SUBST("substitute", 7)/
!           finally
!               if v:errmsg != ""
!                   " If exceptions are not thrown on errors, fake the error
!                   " exception in order to get the same execution path.
!                   throw "faked Vim(substitute)"
!               endif
!           endtry
!       catch /Vim(substitute)/     " Pattern not found ('e' flag missing)
!           Xpath 65536                         " X: 65536
!           3substitute/subst/\=SUBST("substitute", 8)/e
!           Xpath 131072                        " X: 131072
!       endtry
!       Xpath 262144                            " X: 262144
!       4,6substitute/subst/\=SUBST("substitute", 9)/
!       Xpath 524288                            " X: 0
!     catch /^substitute[678]/
!       Xpath 1048576                           " X: 0
!     catch /^substitute9/
!       Xpath 2097152                           " X: 2097152
!     finally
!       bwipeout!
!       call delete(file)
!     endtry
! 
!     try
!       Xpath 4194304                           " X: 4194304
!       let var = substitute("sub", "sub", '\=THROW("substitute()y", 10)', '')
!       Xpath 8388608                           " X: 0
!     catch /substitute()y/
!       Xpath 16777216                          " X: 16777216
!     catch /.*/
!       Xpath 33554432                          " X: 0
!       Xout "substitute()y:" v:exception "in" v:throwpoint
!     endtry
! 
!     try
!       Xpath 67108864                          " X: 67108864
!       let var = substitute("not", "sub", '\=THROW("substitute()n", 11)', '')
!       Xpath 134217728                         " X: 134217728
!     catch /substitute()n/
!       Xpath 268435456                         " X: 0
!     catch /.*/
!       Xpath 536870912                         " X: 0
!       Xout "substitute()n:" v:exception "in" v:throwpoint
!     endtry
! 
!     let expected = "E1T1E2T2S3(3)S4(5s)S4(7t)T4U6(1)U6(2)U9(4)U9(5t)T9T10"
!     if taken != expected
!       Xpath 1073741824                        " X: 0
!       Xout "'taken' is" taken "instead of" expected
!     endif
! 
! catch /.*/
!     " The Xpath command does not accept 2^31 (negative); add explicitly:
!     let Xpath = Xpath + 2147483648            " X: 0
!     Xout v:exception "in" v:throwpoint
! endtry
! 
! unlet result var taken expected
! delfunction THROW
! delfunction EXPR
! delfunction SKIP
! delfunction SUBST
! 
! Xcheck 224907669
! 
! 
! 
"-------------------------------------------------------------------------------
! " Test 75:  Errors in builtin functions.                                  {{{1
! "
! "         On an error in a builtin function called inside a :try/:endtry
! "         region, the evaluation of the expression calling that function and
! "         the command containing that expression are abandoned.  The error can
! "         be caught as an exception.
! "
! "         A simple :call of the builtin function is a trivial case.  If the
! "         builtin function is called in the argument list of another function,
! "         no further arguments are evaluated, and the other function is not
! "         executed.  If the builtin function is called from the argument of
! "         a :return command, the :return command is not executed.  If the
! "         builtin function is called from the argument of a :throw command,
! "         the :throw command is not executed.  The evaluation of the
! "         expression calling the builtin function is abandoned.
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! function! F1(arg1)
!     Xpath 1                                   " X: 0
! endfunction
! 
! function! F2(arg1, arg2)
!     Xpath 2                                   " X: 0
! endfunction
! 
! function! G()
!     Xpath 4                                   " X: 0
! endfunction
! 
! function! H()
!     Xpath 8                                   " X: 0
! endfunction
! 
! function! R()
!     while 1
!       try
!           let caught = 0
!           let v:errmsg = ""
!           Xpath 16                            " X: 16
!           return append(1, "s")
!       catch /E21/
!           let caught = 1
!       catch /.*/
!           Xpath 32                            " X: 0
!       finally
!           Xpath 64                            " X: 64
!           if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
!               Xpath 128                       " X: 128
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
!     Xpath 256                                 " X: 256
! endfunction
! 
! try
!     set noma  " let append() fail with "E21"
! 
!     while 1
!       try
!           let caught = 0
!           let v:errmsg = ""
!           Xpath 512                           " X: 512
!           call append(1, "s")
!       catch /E21/
!           let caught = 1
!       catch /.*/
!           Xpath 1024                          " X: 0
!       finally
!           Xpath 2048                          " X: 2048
!           if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
!               Xpath 4096                      " X: 4096
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
! 
!     while 1
!       try
!           let caught = 0
!           let v:errmsg = ""
!           Xpath 8192                          " X: 8192
!           call F1('x' . append(1, "s"))
!       catch /E21/
!           let caught = 1
!       catch /.*/
!           Xpath 16384                         " X: 0
!       finally
!           Xpath 32768                         " X: 32768
!           if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
!               Xpath 65536                     " X: 65536
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
! 
!     while 1
!       try
!           let caught = 0
!           let v:errmsg = ""
!           Xpath 131072                        " X: 131072
!           call F2('x' . append(1, "s"), G())
!       catch /E21/
!           let caught = 1
!       catch /.*/
!           Xpath 262144                        " X: 0
!       finally
!           Xpath 524288                        " X: 524288
!           if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
!               Xpath 1048576                   " X: 1048576
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
! 
!     call R()
! 
!     while 1
!       try
!           let caught = 0
!           let v:errmsg = ""
!           Xpath 2097152                       " X: 2097152
!           throw "T" . append(1, "s")
!       catch /E21/
!           let caught = 1
!       catch /^T.*/
!           Xpath 4194304                       " X: 0
!       catch /.*/
!           Xpath 8388608                       " X: 0
!       finally
!           Xpath 16777216                      " X: 16777216
!           if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
!               Xpath 33554432                  " X: 33554432
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
! 
!     while 1
!       try
!           let caught = 0
!           let v:errmsg = ""
!           Xpath 67108864                      " X: 67108864
!           let x = "a"
!           let x = x . "b" . append(1, "s") . H()
!       catch /E21/
!           let caught = 1
!       catch /.*/
!           Xpath 134217728                     " X: 0
!       finally
!           Xpath 268435456                     " X: 268435456
!           if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
!               Xpath 536870912                 " X: 536870912
!           endif
!           if x == "a"
!               Xpath 1073741824                " X: 1073741824
!           endif
!           break               " discard error for $VIMNOERRTHROW
!       endtry
!     endwhile
! catch /.*/
!     " The Xpath command does not accept 2^31 (negative); add explicitly:
!     let Xpath = Xpath + 2147483648            " X: 0
!     Xout v:exception "in" v:throwpoint
! finally
!     set ma&
! endtry
! 
! unlet! caught x
! delfunction F1
! delfunction F2
! delfunction G
! delfunction H
! delfunction R
! 
! Xcheck 2000403408
  
  
  
"-------------------------------------------------------------------------------
--- 4912,4919 ----
  
  Xcheck 212514423
  
! " Tests 69 to 75 were moved to test_trycatch.vim
! let Xtest = 76
  
  
  
"-------------------------------------------------------------------------------
***************
*** 8780,8815 ****
  Xout  "No Crash for vimgrep on BufUnload"
  Xcheck 0 
  
! 
"-------------------------------------------------------------------------------
! " Test 87   using (expr) ? funcref : funcref                              {{{1
! "
! "         Vim needs to correctly parse the funcref and even when it does
! "         not execute the funcref, it needs to consume the trailing ()
! 
"-------------------------------------------------------------------------------
! 
! XpathINIT
! 
! func Add2(x1, x2)
!     return a:x1 + a:x2
! endfu
! 
! func GetStr()
!     return "abcdefghijklmnopqrstuvwxyp"
! endfu
  
- echo function('Add2')(2,3)
- 
- Xout 1 ? function('Add2')(1,2) : function('Add2')(2,3)
- Xout 0 ? function('Add2')(1,2) : function('Add2')(2,3)
- " Make sure, GetStr() still works.
- Xout GetStr()[0:10]
- 
- 
- delfunction GetStr
- delfunction Add2
- Xout  "Successfully executed funcref Add2"
- 
- Xcheck 0 
  
  
"-------------------------------------------------------------------------------
  " Test 88:  $VIMNOERRTHROW and $VIMNOINTTHROW support                     {{{1
--- 6519,6527 ----
  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
*** ../vim-8.1.2245/src/testdir/test_trycatch.vim       2019-11-03 
16:16:59.339738638 +0100
--- src/testdir/test_trycatch.vim       2019-11-03 16:09:05.321249714 +0100
***************
*** 0 ****
--- 1,1977 ----
+ " Test try-catch-finally exception handling
+ " Most of this was formerly in test49.
+ 
+ source check.vim
+ source shared.vim
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test environment                                                        {{{1
+ 
"-------------------------------------------------------------------------------
+ 
+ com!             XpathINIT  let g:Xpath = ''
+ com! -nargs=1 -bar Xpath      let g:Xpath = g:Xpath . <args>
+ 
+ " Test 25:  Executing :finally clauses on normal control flow             {{{1
+ "
+ "         Control flow in a :try conditional should always fall through to its
+ "         :finally clause.  A :finally clause of a :try conditional inside an
+ "         inactive conditional should never be executed.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T25_F()
+   let loops = 3
+   while loops > 0
+     Xpath 'a' . loops
+     if loops >= 2
+       try
+         Xpath 'b' . loops
+         if loops == 2
+           try
+             Xpath 'c' . loops
+           finally
+             Xpath 'd' . loops
+           endtry
+         endif
+       finally
+         Xpath 'e' . loops
+         if loops == 2
+           try
+             Xpath 'f' . loops
+           finally
+             Xpath 'g' . loops
+           endtry
+         endif
+       endtry
+     endif
+     Xpath 'h' . loops
+     let loops = loops - 1
+   endwhile
+   Xpath 'i'
+ endfunc
+ 
+ func T25_G()
+   if 1
+     try
+       Xpath 'A'
+       call T25_F()
+       Xpath 'B'
+     finally
+       Xpath 'C'
+     endtry
+   else
+     try
+       Xpath 'D'
+     finally
+       Xpath 'E'
+     endtry
+   endif
+ endfunc
+ 
+ func Test_finally()
+   XpathINIT
+   call T25_G()
+   call assert_equal('Aa3b3e3h3a2b2c2d2e2f2g2h2a1h1iBC', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 26:  Executing :finally clauses after :continue or :break          {{{1
+ "
+ "         For a :continue or :break dynamically enclosed in a :try/:endtry
+ "         region inside the next surrounding :while/:endwhile, if the
+ "         :continue/:break is before the :finally, the :finally clause is
+ "         executed first.  If the :continue/:break is after the :finally, the
+ "         :finally clause is broken (like an :if/:endif region).
+ 
"-------------------------------------------------------------------------------
+ 
+ func T26_F()
+   try
+     let loops = 3
+     while loops > 0
+       try
+         try
+           if loops == 2
+             Xpath 'a' . loops
+             let loops = loops - 1
+             continue
+           elseif loops == 1
+             Xpath 'b' . loops
+             break
+             finish
+           endif
+           Xpath 'c' . loops
+         endtry
+       finally
+         Xpath 'd' . loops
+       endtry
+       Xpath 'e' . loops
+       let loops = loops - 1
+     endwhile
+     Xpath 'f'
+   finally
+     Xpath 'g'
+     let loops = 3
+     while loops > 0
+       try
+       finally
+         try
+           if loops == 2
+             Xpath 'h' . loops
+             let loops = loops - 1
+             continue
+           elseif loops == 1
+             Xpath 'i' . loops
+             break
+             finish
+           endif
+         endtry
+         Xpath 'j' . loops
+       endtry
+       Xpath 'k' . loops
+       let loops = loops - 1
+     endwhile
+     Xpath 'l'
+   endtry
+   Xpath 'm'
+ endfunc
+ 
+ func Test_finally_after_continue()
+   XpathINIT
+   call T26_F()
+   call assert_equal('c3d3e3a2d1b1d1fgj3k3h2i1lm', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 32:  Remembering the :return value on :finally                     {{{1
+ "
+ "         If a :finally clause is executed due to a :return specifying
+ "         a value, this is the value visible to the caller if not overwritten
+ "         by a new :return in the :finally clause.  A :return without a value
+ "         in the :finally clause overwrites with value 0.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T32_F()
+   try
+     Xpath 'a'
+     try
+       Xpath 'b'
+       return "ABCD"
+       Xpath 'c'
+     finally
+       Xpath 'd'
+     endtry
+     Xpath 'e'
+   finally
+     Xpath 'f'
+   endtry
+   Xpath 'g'
+ endfunc
+ 
+ func T32_G()
+   try
+     Xpath 'h'
+     return 8
+     Xpath 'i'
+   finally
+     Xpath 'j'
+     return 16 + strlen(T32_F())
+     Xpath 'k'
+   endtry
+   Xpath 'l'
+ endfunc
+ 
+ func T32_H()
+   try
+     Xpath 'm'
+     return 32
+     Xpath 'n'
+   finally
+     Xpath 'o'
+     return
+     Xpath 'p'
+   endtry
+   Xpath 'q'
+ endfunc
+ 
+ func T32_I()
+   try
+     Xpath 'r'
+   finally
+     Xpath 's'
+     return T32_G() + T32_H() + 64
+     Xpath 't'
+   endtry
+   Xpath 'u'
+ endfunc
+ 
+ func Test_finally_return()
+   XpathINIT
+   call assert_equal(84, T32_I())
+   call assert_equal('rshjabdfmo', g:Xpath)
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 33:  :return under :execute or user command and :finally               
    {{{1
+ "
+ "         A :return command may be executed under an ":execute" or from
+ "         a user command.  Executing of :finally clauses and passing through
+ "         the return code works also then.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T33_F()
+   try
+     RETURN 10
+     Xpath 'a'
+   finally
+     Xpath 'b'
+   endtry
+   Xpath 'c'
+ endfunc
+ 
+ func T33_G()
+   try
+     RETURN 20
+     Xpath 'd'
+   finally
+     Xpath 'e'
+     RETURN 30
+     Xpath 'f'
+   endtry
+   Xpath 'g'
+ endfunc
+ 
+ func T33_H()
+   try
+     execute "try | return 40 | finally | return 50 | endtry"
+     Xpath 'h'
+   finally
+     Xpath 'i'
+   endtry
+   Xpath 'j'
+ endfunc
+ 
+ func T33_I()
+   try
+     execute "try | return 60 | finally | return 70 | endtry"
+     Xpath 'k'
+   finally
+     Xpath 'l'
+     execute "try | return 80 | finally | return 90 | endtry"
+     Xpath 'm'
+   endtry
+   Xpath 'n'
+ endfunc
+ 
+ func T33_J()
+   try
+     RETURN 100
+     Xpath 'o'
+   finally
+     Xpath 'p'
+     return
+     Xpath 'q'
+   endtry
+   Xpath 'r'
+ endfunc
+ 
+ func T33_K()
+   try
+     execute "try | return 110 | finally | return 120 | endtry"
+     Xpath 's'
+   finally
+     Xpath 't'
+     execute "try | return 130 | finally | return | endtry"
+     Xpath 'u'
+   endtry
+   Xpath 'v'
+ endfunc
+ 
+ func T33_L()
+   try
+     return
+     Xpath 'w'
+   finally
+     Xpath 'x'
+     RETURN 140
+     Xpath 'y'
+   endtry
+   Xpath 'z'
+ endfunc
+ 
+ func T33_M()
+   try
+     return
+     Xpath 'A'
+   finally
+     Xpath 'B'
+     execute "try | return 150 | finally | return 160 | endtry"
+     Xpath 'C'
+   endtry
+   Xpath 'D'
+ endfunc
+ 
+ func T33_N()
+   RETURN 170
+ endfunc
+ 
+ func T33_O()
+   execute "try | return 180 | finally | return 190 | endtry"
+ endfunc
+ 
+ func Test_finally_cmd_return()
+   command! -nargs=? RETURN
+         \ try | return <args> | finally | return <args> * 2 | endtry
+   XpathINIT
+   call assert_equal(20, T33_F())
+   call assert_equal(60, T33_G())
+   call assert_equal(50, T33_H())
+   call assert_equal(90, T33_I())
+   call assert_equal(0, T33_J())
+   call assert_equal(0, T33_K())
+   call assert_equal(280, T33_L())
+   call assert_equal(160, T33_M())
+   call assert_equal(340, T33_N())
+   call assert_equal(190, T33_O())
+   call assert_equal('beilptxB', g:Xpath)
+   delcommand RETURN
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 41:  Skipped :throw finding next command                               
    {{{1
+ "
+ "         A :throw in an inactive conditional must not hide a following
+ "         command.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T41_F()
+   Xpath 'a'
+   if 0 | throw 'never' | endif | Xpath 'b'
+   Xpath 'c'
+ endfunc
+ 
+ func T41_G()
+   Xpath 'd'
+   while 0 | throw 'never' | endwhile | Xpath 'e'
+   Xpath 'f'
+ endfunc
+ 
+ func T41_H()
+   Xpath 'g'
+   if 0 | try | throw 'never' | endtry | endif | Xpath 'h'
+   Xpath 'i'
+ endfunc
+ 
+ func Test_throw_inactive_cond()
+   XpathINIT
+   try
+     Xpath 'j'
+     call T41_F()
+     Xpath 'k'
+   catch /.*/
+     Xpath 'l'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ 
+   try
+     Xpath 'm'
+     call T41_G()
+     Xpath 'n'
+   catch /.*/
+     Xpath 'o'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ 
+   try
+     Xpath 'p'
+     call T41_H()
+     Xpath 'q'
+   catch /.*/
+     Xpath 'r'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ 
+   call assert_equal('jabckmdefnpghiq', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 42:  Catching number and string exceptions                         {{{1
+ "
+ "         When a number is thrown, it is converted to a string exception.
+ "         Numbers and strings may be caught by specifying a regular exception
+ "         as argument to the :catch command.
+ 
"-------------------------------------------------------------------------------
+ 
+ 
+ func T42_F()
+   try
+ 
+     try
+       Xpath 'a'
+       throw 4711
+       Xpath 'b'
+     catch /4711/
+       Xpath 'c'
+     endtry
+ 
+     try
+       Xpath 'd'
+       throw 4711
+       Xpath 'e'
+     catch /^4711$/
+       Xpath 'f'
+     endtry
+ 
+     try
+       Xpath 'g'
+       throw 4711
+       Xpath 'h'
+     catch /\d/
+       Xpath 'i'
+     endtry
+ 
+     try
+       Xpath 'j'
+       throw 4711
+       Xpath 'k'
+     catch /^\d\+$/
+       Xpath 'l'
+     endtry
+ 
+     try
+       Xpath 'm'
+       throw "arrgh"
+       Xpath 'n'
+     catch /arrgh/
+       Xpath 'o'
+     endtry
+ 
+     try
+       Xpath 'p'
+       throw "arrgh"
+       Xpath 'q'
+     catch /^arrgh$/
+       Xpath 'r'
+     endtry
+ 
+     try
+       Xpath 's'
+       throw "arrgh"
+       Xpath 't'
+     catch /\l/
+       Xpath 'u'
+     endtry
+ 
+     try
+       Xpath 'v'
+       throw "arrgh"
+       Xpath 'w'
+     catch /^\l\+$/
+       Xpath 'x'
+     endtry
+ 
+     try
+       try
+         Xpath 'y'
+         throw "ARRGH"
+         Xpath 'z'
+       catch /^arrgh$/
+         Xpath 'A'
+       endtry
+     catch /^\carrgh$/
+       Xpath 'B'
+     endtry
+ 
+     try
+       Xpath 'C'
+       throw ""
+       Xpath 'D'
+     catch /^$/
+       Xpath 'E'
+     endtry
+ 
+   catch /.*/
+     Xpath 'F'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ endfunc
+ 
+ func Test_catch_number_string()
+   XpathINIT
+   call T42_F()
+   call assert_equal('acdfgijlmoprsuvxyBCE', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 43:  Selecting the correct :catch clause                               
    {{{1
+ "
+ "         When an exception is thrown and there are multiple :catch clauses,
+ "         the first matching one is taken.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T43_F()
+   let loops = 3
+   while loops > 0
+     try
+       if loops == 3
+         Xpath 'a' . loops
+         throw "a"
+         Xpath 'b' . loops
+       elseif loops == 2
+         Xpath 'c' . loops
+         throw "ab"
+         Xpath 'd' . loops
+       elseif loops == 1
+         Xpath 'e' . loops
+         throw "abc"
+         Xpath 'f' . loops
+       endif
+     catch /abc/
+       Xpath 'g' . loops
+     catch /ab/
+       Xpath 'h' . loops
+     catch /.*/
+       Xpath 'i' . loops
+     catch /a/
+       Xpath 'j' . loops
+     endtry
+ 
+     let loops = loops - 1
+   endwhile
+   Xpath 'k'
+ endfunc
+ 
+ func Test_multi_catch()
+   XpathINIT
+   call T43_F()
+   call assert_equal('a3i3c2h2e1g1k', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 44:  Missing or empty :catch patterns                              {{{1
+ "
+ "         A missing or empty :catch pattern means the same as /.*/, that is,
+ "         catches everything.  To catch only empty exceptions, /^$/ must be
+ "         used.  A :catch with missing, empty, or /.*/ argument also works
+ "         when followed by another command separated by a bar on the same
+ "         line.  :catch patterns cannot be specified between ||.  But other
+ "         pattern separators can be used instead of //.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T44_F()
+   try
+     try
+       Xpath 'a'
+       throw ""
+     catch /^$/
+       Xpath 'b'
+     endtry
+ 
+     try
+       Xpath 'c'
+       throw ""
+     catch /.*/
+       Xpath 'd'
+     endtry
+ 
+     try
+       Xpath 'e'
+       throw ""
+     catch //
+       Xpath 'f'
+     endtry
+ 
+     try
+       Xpath 'g'
+       throw ""
+     catch
+       Xpath 'h'
+     endtry
+ 
+     try
+       Xpath 'i'
+       throw "oops"
+     catch /^$/
+       Xpath 'j'
+     catch /.*/
+       Xpath 'k'
+     endtry
+ 
+     try
+       Xpath 'l'
+       throw "arrgh"
+     catch /^$/
+       Xpath 'm'
+     catch //
+       Xpath 'n'
+     endtry
+ 
+     try
+       Xpath 'o'
+       throw "brrr"
+     catch /^$/
+       Xpath 'p'
+     catch
+       Xpath 'q'
+     endtry
+ 
+     try | Xpath 'r' | throw "x" | catch /.*/ | Xpath 's' | endtry
+ 
+     try | Xpath 't' | throw "y" | catch // | Xpath 'u' | endtry
+ 
+     while 1
+       try
+         let caught = 0
+         let v:errmsg = ""
+         " Extra try level:  if ":catch" without arguments below raises
+         " a syntax error because it misinterprets the "Xpath" as a pattern,
+         " let it be caught by the ":catch /.*/" below.
+         try
+           try | Xpath 'v' | throw "z" | catch | Xpath 'w' | :
+           endtry
+         endtry
+       catch /.*/
+         let caught = 1
+         call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+       finally
+         if $VIMNOERRTHROW && v:errmsg != ""
+           call assert_report(v:errmsg)
+         endif
+         if caught || $VIMNOERRTHROW && v:errmsg != ""
+           Xpath 'x'
+         endif
+         break         " discard error for $VIMNOERRTHROW
+       endtry
+     endwhile
+ 
+     let cologne = 4711
+     try
+       try
+         Xpath 'y'
+         throw "throw cologne"
+         " Next lines catches all and throws 4711:
+       catch |throw cologne|
+         Xpath 'z'
+       endtry
+     catch /4711/
+       Xpath 'A'
+     endtry
+ 
+     try
+       Xpath 'B'
+       throw "plus"
+     catch +plus+
+       Xpath 'C'
+     endtry
+ 
+     Xpath 'D'
+   catch /.*/
+     Xpath 'E'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ endfunc
+ 
+ func Test_empty_catch()
+   XpathINIT
+   call T44_F()
+   call assert_equal('abcdefghiklnoqrstuvwyABCD', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 45:  Catching exceptions from nested :try blocks                       
    {{{1
+ "
+ "         When :try blocks are nested, an exception is caught by the innermost
+ "         try conditional that has a matching :catch clause.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T45_F()
+   let loops = 3
+   while loops > 0
+     try
+       try
+         try
+           try
+             if loops == 3
+               Xpath 'a' . loops
+               throw "a"
+               Xpath 'b' . loops
+             elseif loops == 2
+               Xpath 'c' . loops
+               throw "ab"
+               Xpath 'd' . loops
+             elseif loops == 1
+               Xpath 'e' . loops
+               throw "abc"
+               Xpath 'f' . loops
+             endif
+           catch /abc/
+             Xpath 'g' . loops
+           endtry
+         catch /ab/
+           Xpath 'h' . loops
+         endtry
+       catch /.*/
+         Xpath 'i' . loops
+       endtry
+     catch /a/
+       Xpath 'j' . loops
+     endtry
+ 
+     let loops = loops - 1
+   endwhile
+   Xpath 'k'
+ endfunc
+ 
+ func Test_catch_from_nested_try()
+   XpathINIT
+   call T45_F()
+   call assert_equal('a3i3c2h2e1g1k', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 46:  Executing :finally after a :throw in nested :try              {{{1
+ "
+ "         When an exception is thrown from within nested :try blocks, the
+ "         :finally clauses of the non-catching try conditionals should be
+ "         executed before the matching :catch of the next surrounding :try
+ "         gets the control.  If this also has a :finally clause, it is
+ "         executed afterwards.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T46_F()
+   let sum = 0
+ 
+   try
+     Xpath 'a'
+     try
+       Xpath 'b'
+       try
+         Xpath 'c'
+         try
+           Xpath 'd'
+           throw "ABC"
+           Xpath 'e'
+         catch /xyz/
+           Xpath 'f'
+         finally
+           Xpath 'g'
+           if sum != 0
+             Xpath 'h'
+           endif
+           let sum = sum + 1
+         endtry
+         Xpath 'i'
+       catch /123/
+         Xpath 'j'
+       catch /321/
+         Xpath 'k'
+       finally
+         Xpath 'l'
+         if sum != 1
+           Xpath 'm'
+         endif
+         let sum = sum + 2
+       endtry
+       Xpath 'n'
+     finally
+       Xpath 'o'
+       if sum != 3
+         Xpath 'p'
+       endif
+       let sum = sum + 4
+     endtry
+     Xpath 'q'
+   catch /ABC/
+     Xpath 'r'
+     if sum != 7
+       Xpath 's'
+     endif
+     let sum = sum + 8
+   finally
+     Xpath 't'
+     if sum != 15
+       Xpath 'u'
+     endif
+     let sum = sum + 16
+   endtry
+   Xpath 'v'
+   if sum != 31
+     Xpath 'w'
+   endif
+ endfunc
+ 
+ func Test_finally_after_throw()
+   XpathINIT
+   call T46_F()
+   call assert_equal('abcdglortv', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 47:  Throwing exceptions from a :catch clause                      {{{1
+ "
+ "         When an exception is thrown from a :catch clause, it should not be
+ "         caught by a :catch of the same :try conditional.  After executing
+ "         the :finally clause (if present), surrounding try conditionals
+ "         should be checked for a matching :catch.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T47_F()
+   Xpath 'a'
+   try
+     Xpath 'b'
+     try
+       Xpath 'c'
+       try
+         Xpath 'd'
+         throw "x1"
+         Xpath 'e'
+       catch /x1/
+         Xpath 'f'
+         try
+           Xpath 'g'
+           throw "x2"
+           Xpath 'h'
+         catch /x1/
+           Xpath 'i'
+         catch /x2/
+           Xpath 'j'
+           try
+             Xpath 'k'
+             throw "x3"
+             Xpath 'l'
+           catch /x1/
+             Xpath 'm'
+           catch /x2/
+             Xpath 'n'
+           finally
+             Xpath 'o'
+           endtry
+           Xpath 'p'
+         catch /x3/
+           Xpath 'q'
+         endtry
+         Xpath 'r'
+       catch /x1/
+         Xpath 's'
+       catch /x2/
+         Xpath 't'
+       catch /x3/
+         Xpath 'u'
+       finally
+         Xpath 'v'
+       endtry
+       Xpath 'w'
+     catch /x1/
+       Xpath 'x'
+     catch /x2/
+       Xpath 'y'
+     catch /x3/
+       Xpath 'z'
+     endtry
+     Xpath 'A'
+   catch /.*/
+     Xpath 'B'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+   Xpath 'C'
+ endfunc
+ 
+ func Test_throw_from_catch()
+   XpathINIT
+   call T47_F()
+   call assert_equal('abcdfgjkovzAC', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 48:  Throwing exceptions from a :finally clause                        
    {{{1
+ "
+ "         When an exception is thrown from a :finally clause, it should not be
+ "         caught by a :catch of the same :try conditional.  Surrounding try
+ "         conditionals should be checked for a matching :catch.  A previously
+ "         thrown exception is discarded.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T48_F()
+   try
+ 
+     try
+       try
+         Xpath 'a'
+       catch /x1/
+         Xpath 'b'
+       finally
+         Xpath 'c'
+         throw "x1"
+         Xpath 'd'
+       endtry
+       Xpath 'e'
+     catch /x1/
+       Xpath 'f'
+     endtry
+     Xpath 'g'
+ 
+     try
+       try
+         Xpath 'h'
+         throw "x2"
+         Xpath 'i'
+       catch /x2/
+         Xpath 'j'
+       catch /x3/
+         Xpath 'k'
+       finally
+         Xpath 'l'
+         throw "x3"
+         Xpath 'm'
+       endtry
+       Xpath 'n'
+     catch /x2/
+       Xpath 'o'
+     catch /x3/
+       Xpath 'p'
+     endtry
+     Xpath 'q'
+ 
+     try
+       try
+         try
+           Xpath 'r'
+           throw "x4"
+           Xpath 's'
+         catch /x5/
+           Xpath 't'
+         finally
+           Xpath 'u'
+           throw "x5"  " discards 'x4'
+           Xpath 'v'
+         endtry
+         Xpath 'w'
+       catch /x4/
+         Xpath 'x'
+       finally
+         Xpath 'y'
+       endtry
+       Xpath 'z'
+     catch /x5/
+       Xpath 'A'
+     endtry
+     Xpath 'B'
+ 
+   catch /.*/
+     Xpath 'C'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+   Xpath 'D'
+ endfunc
+ 
+ func Test_throw_from_finally()
+   XpathINIT
+   call T48_F()
+   call assert_equal('acfghjlpqruyABD', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 51:  Throwing exceptions across :execute and user commands         {{{1
+ "
+ "         A :throw command may be executed under an ":execute" or from
+ "         a user command.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T51_F()
+   command! -nargs=? THROW1    throw <args> | throw 1
+   command! -nargs=? THROW2    try | throw <args> | endtry | throw 2
+   command! -nargs=? THROW3    try | throw 3 | catch /3/ | throw <args> | 
endtry
+   command! -nargs=? THROW4    try | throw 4 | finally   | throw <args> | 
endtry
+ 
+   try
+ 
+     try
+       try
+         Xpath 'a'
+         THROW1 "A"
+       catch /A/
+         Xpath 'b'
+       endtry
+     catch /1/
+       Xpath 'c'
+     endtry
+ 
+     try
+       try
+         Xpath 'd'
+         THROW2 "B"
+       catch /B/
+         Xpath 'e'
+       endtry
+     catch /2/
+       Xpath 'f'
+     endtry
+ 
+     try
+       try
+         Xpath 'g'
+         THROW3 "C"
+       catch /C/
+         Xpath 'h'
+       endtry
+     catch /3/
+       Xpath 'i'
+     endtry
+ 
+     try
+       try
+         Xpath 'j'
+         THROW4 "D"
+       catch /D/
+         Xpath 'k'
+       endtry
+     catch /4/
+       Xpath 'l'
+     endtry
+ 
+     try
+       try
+         Xpath 'm'
+         execute 'throw "E" | throw 5'
+       catch /E/
+         Xpath 'n'
+       endtry
+     catch /5/
+       Xpath 'o'
+     endtry
+ 
+     try
+       try
+         Xpath 'p'
+         execute 'try | throw "F" | endtry | throw 6'
+       catch /F/
+         Xpath 'q'
+       endtry
+     catch /6/
+       Xpath 'r'
+     endtry
+ 
+     try
+       try
+         Xpath 's'
+         execute'try | throw 7 | catch /7/ | throw "G" | endtry'
+       catch /G/
+         Xpath 't'
+       endtry
+     catch /7/
+       Xpath 'u'
+     endtry
+ 
+     try
+       try
+         Xpath 'v'
+         execute 'try | throw 8 | finally   | throw "H" | endtry'
+       catch /H/
+         Xpath 'w'
+       endtry
+     catch /8/
+       Xpath 'x'
+     endtry
+ 
+   catch /.*/
+     Xpath 'y'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ 
+   Xpath 'z'
+ 
+   delcommand THROW1
+   delcommand THROW2
+   delcommand THROW3
+   delcommand THROW4
+ endfunc
+ 
+ func Test_throw_across_commands()
+   XpathINIT
+   call T51_F()
+   call assert_equal('abdeghjkmnpqstvwz', g:Xpath)
+ endfunc
+ 
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 69:  :throw across :if, :elseif, :while                                
    {{{1
+ "
+ "         On an :if, :elseif, or :while command, an exception might be thrown
+ "         during evaluation of the expression to test.  The exception can be
+ "         caught by the script.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T69_throw(x)
+   Xpath 'x'
+   throw a:x
+ endfunc
+ 
+ func Test_throw_ifelsewhile()
+   XpathINIT
+ 
+   try
+     try
+       Xpath 'a'
+       if 111 == T69_throw("if") + 111
+         Xpath 'b'
+       else
+         Xpath 'c'
+       endif
+       Xpath 'd'
+     catch /^if$/
+       Xpath 'e'
+     catch /.*/
+       Xpath 'f'
+       call assert_report("if: " . v:exception . " in " . v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 'g'
+       if v:false
+         Xpath 'h'
+       elseif 222 == T69_throw("elseif") + 222
+         Xpath 'i'
+       else
+         Xpath 'j'
+       endif
+       Xpath 'k'
+     catch /^elseif$/
+       Xpath 'l'
+     catch /.*/
+       Xpath 'm'
+       call assert_report("elseif: " . v:exception . " in " . v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 'n'
+       while 333 == T69_throw("while") + 333
+         Xpath 'o'
+         break
+       endwhile
+       Xpath 'p'
+     catch /^while$/
+       Xpath 'q'
+     catch /.*/
+       Xpath 'r'
+       call assert_report("while: " .. v:exception .. " in " .. v:throwpoint)
+     endtry
+   catch /^0$/     " default return value
+     Xpath 's'
+     call assert_report(v:throwpoint)
+   catch /.*/
+     call assert_report(v:exception .. " in " .. v:throwpoint)
+     Xpath 't'
+   endtry
+ 
+   call assert_equal('axegxlnxq', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 70:  :throw across :return or :throw                               {{{1
+ "
+ "         On a :return or :throw command, an exception might be thrown during
+ "         evaluation of the expression to return or throw, respectively.  The
+ "         exception can be caught by the script.
+ 
"-------------------------------------------------------------------------------
+ 
+ let T70_taken = ""
+ 
+ func T70_throw(x, n)
+     let g:T70_taken = g:T70_taken . "T" . a:n
+     throw a:x
+ endfunc
+ 
+ func T70_F(x, y, n)
+     let g:T70_taken = g:T70_taken . "F" . a:n
+     return a:x + T70_throw(a:y, a:n)
+ endfunc
+ 
+ func T70_G(x, y, n)
+     let g:T70_taken = g:T70_taken . "G" . a:n
+     throw a:x . T70_throw(a:y, a:n)
+     return a:x
+ endfunc
+ 
+ func Test_throwreturn()
+   XpathINIT
+ 
+   try
+     try
+       Xpath 'a'
+       call T70_F(4711, "return", 1)
+       Xpath 'b'
+     catch /^return$/
+       Xpath 'c'
+     catch /.*/
+       Xpath 'd'
+       call assert_report("return: " .. v:exception .. " in " .. v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 'e'
+       let var = T70_F(4712, "return-var", 2)
+       Xpath 'f'
+     catch /^return-var$/
+       Xpath 'g'
+     catch /.*/
+       Xpath 'h'
+       call assert_report("return-var: " . v:exception . " in " . v:throwpoint)
+     finally
+       unlet! var
+     endtry
+ 
+     try
+       Xpath 'i'
+       throw "except1" . T70_throw("throw1", 3)
+       Xpath 'j'
+     catch /^except1/
+       Xpath 'k'
+     catch /^throw1$/
+       Xpath 'l'
+     catch /.*/
+       Xpath 'm'
+       call assert_report("throw1: " .. v:exception .. " in " .. v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 'n'
+       call T70_G("except2", "throw2", 4)
+       Xpath 'o'
+     catch /^except2/
+       Xpath 'p'
+     catch /^throw2$/
+       Xpath 'q'
+     catch /.*/
+       Xpath 'r'
+       call assert_report("throw2: " .. v:exception .. " in " .. v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 's'
+       let var = T70_G("except3", "throw3", 5)
+       Xpath 't'
+     catch /^except3/
+       Xpath 'u'
+     catch /^throw3$/
+       Xpath 'v'
+     catch /.*/
+       Xpath 'w'
+       call assert_report("throw3: " .. v:exception .. " in " .. v:throwpoint)
+     finally
+       unlet! var
+     endtry
+ 
+     call assert_equal('F1T1F2T2T3G4T4G5T5', g:T70_taken)
+     Xpath 'x'
+   catch /^0$/     " default return value
+     Xpath 'y'
+     call assert_report(v:throwpoint)
+   catch /.*/
+     Xpath 'z'
+     call assert_report('Caught' .. v:exception .. ' in ' .. v:throwpoint)
+   endtry
+ 
+   call assert_equal('acegilnqsvx', g:Xpath)
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 71:  :throw across :echo variants and :execute                     {{{1
+ "
+ "         On an :echo, :echon, :echomsg, :echoerr, or :execute command, an
+ "         exception might be thrown during evaluation of the arguments to
+ "         be displayed or executed as a command, respectively.  Any following
+ "         arguments are not evaluated, then.  The exception can be caught by
+ "         the script.
+ 
"-------------------------------------------------------------------------------
+ 
+ let T71_taken = ""
+ 
+ func T71_throw(x, n)
+     let g:T71_taken = g:T71_taken . "T" . a:n
+     throw a:x
+ endfunc
+ 
+ func T71_F(n)
+     let g:T71_taken = g:T71_taken . "F" . a:n
+     return "F" . a:n
+ endfunc
+ 
+ func Test_throw_echo()
+   XpathINIT
+ 
+   try
+     try
+       Xpath 'a'
+       echo 'echo ' . T71_throw("echo-except", 1) . T71_F(1)
+       Xpath 'b'
+     catch /^echo-except$/
+       Xpath 'c'
+     catch /.*/
+       Xpath 'd'
+       call assert_report("echo: " .. v:exception .. " in " .. v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 'e'
+       echon "echon " . T71_throw("echon-except", 2) . T71_F(2)
+       Xpath 'f'
+     catch /^echon-except$/
+       Xpath 'g'
+     catch /.*/
+       Xpath 'h'
+       call assert_report('echon: ' . v:exception . ' in ' . v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 'i'
+       echomsg "echomsg " . T71_throw("echomsg-except", 3) . T71_F(3)
+       Xpath 'j'
+     catch /^echomsg-except$/
+       Xpath 'k'
+     catch /.*/
+       Xpath 'l'
+       call assert_report('echomsg: ' . v:exception . ' in ' . v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 'm'
+       echoerr "echoerr " . T71_throw("echoerr-except", 4) . T71_F(4)
+       Xpath 'n'
+     catch /^echoerr-except$/
+       Xpath 'o'
+     catch /Vim/
+       Xpath 'p'
+     catch /echoerr/
+       Xpath 'q'
+     catch /.*/
+       Xpath 'r'
+       call assert_report('echoerr: ' . v:exception . ' in ' . v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 's'
+       execute "echo 'execute " . T71_throw("execute-except", 5) . T71_F(5) "'"
+       Xpath 't'
+     catch /^execute-except$/
+       Xpath 'u'
+     catch /.*/
+       Xpath 'v'
+       call assert_report('execute: ' . v:exception . ' in ' . v:throwpoint)
+     endtry
+ 
+     call assert_equal('T1T2T3T4T5', g:T71_taken)
+     Xpath 'w'
+   catch /^0$/     " default return value
+     Xpath 'x'
+     call assert_report(v:throwpoint)
+   catch /.*/
+     Xpath 'y'
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ 
+   call assert_equal('acegikmosuw', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 72:  :throw across :let or :unlet                                  {{{1
+ "
+ "         On a :let command, an exception might be thrown during evaluation
+ "         of the expression to assign.  On an :let or :unlet command, the
+ "         evaluation of the name of the variable to be assigned or list or
+ "         deleted, respectively, may throw an exception.  Any following
+ "         arguments are not evaluated, then.  The exception can be caught by
+ "         the script.
+ 
"-------------------------------------------------------------------------------
+ 
+ let throwcount = 0
+ 
+ func T72_throw(x)
+   let g:throwcount = g:throwcount + 1
+   throw a:x
+ endfunc
+ 
+ let T72_addpath = ''
+ 
+ func T72_addpath(p)
+   let g:T72_addpath = g:T72_addpath . a:p
+ endfunc
+ 
+ func Test_throw_let()
+   XpathINIT
+ 
+   try
+     try
+       let $VAR = 'old_value'
+       Xpath 'a'
+       let $VAR = 'let(' . T72_throw('var') . ')'
+       Xpath 'b'
+     catch /^var$/
+       Xpath 'c'
+     finally
+       call assert_equal('old_value', $VAR)
+     endtry
+ 
+     try
+       let @a = 'old_value'
+       Xpath 'd'
+       let @a = 'let(' . T72_throw('reg') . ')'
+       Xpath 'e'
+     catch /^reg$/
+       try
+         Xpath 'f'
+         let @A = 'let(' . T72_throw('REG') . ')'
+         Xpath 'g'
+       catch /^REG$/
+         Xpath 'h'
+       endtry
+     finally
+       call assert_equal('old_value', @a)
+       call assert_equal('old_value', @A)
+     endtry
+ 
+     try
+       let saved_gpath = &g:path
+       let saved_lpath = &l:path
+       Xpath 'i'
+       let &path = 'let(' . T72_throw('opt') . ')'
+       Xpath 'j'
+     catch /^opt$/
+       try
+         Xpath 'k'
+         let &g:path = 'let(' . T72_throw('gopt') . ')'
+         Xpath 'l'
+       catch /^gopt$/
+         try
+           Xpath 'm'
+           let &l:path = 'let(' . T72_throw('lopt') . ')'
+           Xpath 'n'
+         catch /^lopt$/
+           Xpath 'o'
+         endtry
+       endtry
+     finally
+       call assert_equal(saved_gpath, &g:path)
+       call assert_equal(saved_lpath, &l:path)
+       let &g:path = saved_gpath
+       let &l:path = saved_lpath
+     endtry
+ 
+     unlet! var1 var2 var3
+ 
+     try
+       Xpath 'p'
+       let var1 = 'let(' . T72_throw('var1') . ')'
+       Xpath 'q'
+     catch /^var1$/
+       Xpath 'r'
+     finally
+       call assert_true(!exists('var1'))
+     endtry
+ 
+     try
+       let var2 = 'old_value'
+       Xpath 's'
+       let var2 = 'let(' . T72_throw('var2'). ')'
+       Xpath 't'
+     catch /^var2$/
+       Xpath 'u'
+     finally
+       call assert_equal('old_value', var2)
+     endtry
+ 
+     try
+       Xpath 'v'
+       let var{T72_throw('var3')} = 4711
+       Xpath 'w'
+     catch /^var3$/
+       Xpath 'x'
+     endtry
+ 
+     try
+       call T72_addpath('T1')
+       let var{T72_throw('var4')} var{T72_addpath('T2')} | call 
T72_addpath('T3')
+       call T72_addpath('T4')
+     catch /^var4$/
+       call T72_addpath('T5')
+     endtry
+ 
+     try
+       call T72_addpath('T6')
+       unlet var{T72_throw('var5')} var{T72_addpath('T7')}
+             \ | call T72_addpath('T8')
+       call T72_addpath('T9')
+     catch /^var5$/
+       call T72_addpath('T10')
+     endtry
+ 
+     call assert_equal('T1T5T6T10', g:T72_addpath)
+     call assert_equal(11, g:throwcount)
+   catch /.*/
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ 
+   call assert_equal('acdfhikmoprsuvx', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 73:  :throw across :function, :delfunction                         {{{1
+ "
+ "         The :function and :delfunction commands may cause an expression
+ "         specified in braces to be evaluated.  During evaluation, an
+ "         exception might be thrown.  The exception can be caught by the
+ "         script.
+ 
"-------------------------------------------------------------------------------
+ 
+ let T73_taken = ''
+ 
+ func T73_throw(x, n)
+   let g:T73_taken = g:T73_taken . 'T' . a:n
+   throw a:x
+ endfunc
+ 
+ func T73_expr(x, n)
+   let g:T73_taken = g:T73_taken . 'E' . a:n
+   if a:n % 2 == 0
+     call T73_throw(a:x, a:n)
+   endif
+   return 2 - a:n % 2
+ endfunc
+ 
+ func Test_throw_func()
+   XpathINIT
+ 
+   try
+     try
+       " Define function.
+       Xpath 'a'
+       function! F0()
+       endfunction
+       Xpath 'b'
+       function! F{T73_expr('function-def-ok', 1)}()
+       endfunction
+       Xpath 'c'
+       function! F{T73_expr('function-def', 2)}()
+       endfunction
+       Xpath 'd'
+     catch /^function-def-ok$/
+       Xpath 'e'
+     catch /^function-def$/
+       Xpath 'f'
+     catch /.*/
+       call assert_report('def: ' . v:exception . ' in ' . v:throwpoint)
+     endtry
+ 
+     try
+       " List function.
+       Xpath 'g'
+       function F0
+       Xpath 'h'
+       function F{T73_expr('function-lst-ok', 3)}
+       Xpath 'i'
+       function F{T73_expr('function-lst', 4)}
+       Xpath 'j'
+     catch /^function-lst-ok$/
+       Xpath 'k'
+     catch /^function-lst$/
+       Xpath 'l'
+     catch /.*/
+       call assert_report('lst: ' . v:exception . ' in ' . v:throwpoint)
+     endtry
+ 
+     try
+       " Delete function
+       Xpath 'm'
+       delfunction F0
+       Xpath 'n'
+       delfunction F{T73_expr('function-del-ok', 5)}
+       Xpath 'o'
+       delfunction F{T73_expr('function-del', 6)}
+       Xpath 'p'
+     catch /^function-del-ok$/
+       Xpath 'q'
+     catch /^function-del$/
+       Xpath 'r'
+     catch /.*/
+       call assert_report('del: ' . v:exception . ' in ' . v:throwpoint)
+     endtry
+     call assert_equal('E1E2T2E3E4T4E5E6T6', g:T73_taken)
+   catch /.*/
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ 
+   call assert_equal('abcfghilmnor', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 74:  :throw across builtin functions and commands                  {{{1
+ "
+ "         Some functions like exists(), searchpair() take expression
+ "         arguments, other functions or commands like substitute() or
+ "         :substitute cause an expression (specified in the regular
+ "         expression) to be evaluated.  During evaluation an exception
+ "         might be thrown.  The exception can be caught by the script.
+ 
"-------------------------------------------------------------------------------
+ 
+ let T74_taken = ""
+ 
+ func T74_throw(x, n)
+   let g:T74_taken = g:T74_taken . "T" . a:n
+   throw a:x
+ endfunc
+ 
+ func T74_expr(x, n)
+   let g:T74_taken = g:T74_taken . "E" . a:n
+   call T74_throw(a:x . a:n, a:n)
+   return "EXPR"
+ endfunc
+ 
+ func T74_skip(x, n)
+   let g:T74_taken = g:T74_taken . "S" . a:n . "(" . line(".")
+   let theline = getline(".")
+   if theline =~ "skip"
+     let g:T74_taken = g:T74_taken . "s)"
+     return 1
+   elseif theline =~ "throw"
+     let g:T74_taken = g:T74_taken . "t)"
+     call T74_throw(a:x . a:n, a:n)
+   else
+     let g:T74_taken = g:T74_taken . ")"
+     return 0
+   endif
+ endfunc
+ 
+ func T74_subst(x, n)
+   let g:T74_taken = g:T74_taken . "U" . a:n . "(" . line(".")
+   let theline = getline(".")
+   if theline =~ "not"       " T74_subst() should not be called for this line
+     let g:T74_taken = g:T74_taken . "n)"
+     call T74_throw(a:x . a:n, a:n)
+   elseif theline =~ "throw"
+     let g:T74_taken = g:T74_taken . "t)"
+     call T74_throw(a:x . a:n, a:n)
+   else
+     let g:T74_taken = g:T74_taken . ")"
+     return "replaced"
+   endif
+ endfunc
+ 
+ func Test_throw_builtin_func()
+   XpathINIT
+ 
+   try
+     try
+       Xpath 'a'
+       let result = exists('*{T74_expr("exists", 1)}')
+       Xpath 'b'
+     catch /^exists1$/
+       Xpath 'c'
+       try
+         let result = exists('{T74_expr("exists", 2)}')
+         Xpath 'd'
+       catch /^exists2$/
+         Xpath 'e'
+       catch /.*/
+         call assert_report('exists2: ' . v:exception . ' in ' . v:throwpoint)
+       endtry
+     catch /.*/
+       call assert_report('exists1: ' . v:exception . ' in ' . v:throwpoint)
+     endtry
+ 
+     try
+       let file = tempname()
+       exec "edit" file
+       call append(0, [
+             \ 'begin',
+             \ 'xx',
+             \ 'middle 3',
+             \ 'xx',
+             \ 'middle 5 skip',
+             \ 'xx',
+             \ 'middle 7 throw',
+             \ 'xx',
+             \ 'end'])
+       normal! gg
+       Xpath 'f'
+       let result = searchpair("begin", "middle", "end", '',
+             \ 'T74_skip("searchpair", 3)')
+       Xpath 'g'
+       let result = searchpair("begin", "middle", "end", '',
+             \ 'T74_skip("searchpair", 4)')
+       Xpath 'h'
+       let result = searchpair("begin", "middle", "end", '',
+             \ 'T74_skip("searchpair", 5)')
+       Xpath 'i'
+     catch /^searchpair[35]$/
+       Xpath 'j'
+     catch /^searchpair4$/
+       Xpath 'k'
+     catch /.*/
+       call assert_report('searchpair: ' . v:exception . ' in ' . v:throwpoint)
+     finally
+       bwipeout!
+       call delete(file)
+     endtry
+ 
+     try
+       let file = tempname()
+       exec "edit" file
+       call append(0, [
+             \ 'subst 1',
+             \ 'subst 2',
+             \ 'not',
+             \ 'subst 4',
+             \ 'subst throw',
+             \ 'subst 6'])
+       normal! gg
+       Xpath 'l'
+       1,2substitute/subst/\=T74_subst("substitute", 6)/
+       try
+         Xpath 'm'
+         try
+           let v:errmsg = ""
+           3substitute/subst/\=T74_subst("substitute", 7)/
+         finally
+           if v:errmsg != ""
+             " If exceptions are not thrown on errors, fake the error
+             " exception in order to get the same execution path.
+             throw "faked Vim(substitute)"
+           endif
+         endtry
+       catch /Vim(substitute)/     " Pattern not found ('e' flag missing)
+         Xpath 'n'
+         3substitute/subst/\=T74_subst("substitute", 8)/e
+         Xpath 'o'
+       endtry
+       Xpath 'p'
+       4,6substitute/subst/\=T74_subst("substitute", 9)/
+       Xpath 'q'
+     catch /^substitute[678]/
+       Xpath 'r'
+     catch /^substitute9/
+       Xpath 's'
+     finally
+       bwipeout!
+       call delete(file)
+     endtry
+ 
+     try
+       Xpath 't'
+       let var = substitute("sub", "sub", '\=T74_throw("substitute()y", 10)', 
'')
+       Xpath 'u'
+     catch /substitute()y/
+       Xpath 'v'
+     catch /.*/
+       call assert_report('substitute()y: ' . v:exception . ' in '
+             \ . v:throwpoint)
+     endtry
+ 
+     try
+       Xpath 'w'
+       let var = substitute("not", "sub", '\=T74_throw("substitute()n", 11)', 
'')
+       Xpath 'x'
+     catch /substitute()n/
+       Xpath 'y'
+     catch /.*/
+       call assert_report('substitute()n: ' . v:exception . ' in '
+             \ . v:throwpoint)
+     endtry
+ 
+     call assert_equal('E1T1E2T2S3(3)S4(5s)S4(7t)T4U6(1)U6(2)U9(4)U9(5t)T9T10',
+           \ g:T74_taken)
+ 
+   catch /.*/
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   endtry
+ 
+   call assert_equal('acefgklmnopstvwx', g:Xpath)
+ endfunc
+ 
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 75:  Errors in builtin functions.                                  {{{1
+ "
+ "         On an error in a builtin function called inside a :try/:endtry
+ "         region, the evaluation of the expression calling that function and
+ "         the command containing that expression are abandoned.  The error can
+ "         be caught as an exception.
+ "
+ "         A simple :call of the builtin function is a trivial case.  If the
+ "         builtin function is called in the argument list of another function,
+ "         no further arguments are evaluated, and the other function is not
+ "         executed.  If the builtin function is called from the argument of
+ "         a :return command, the :return command is not executed.  If the
+ "         builtin function is called from the argument of a :throw command,
+ "         the :throw command is not executed.  The evaluation of the
+ "         expression calling the builtin function is abandoned.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T75_F1(arg1)
+   Xpath 'a'
+ endfunc
+ 
+ func T75_F2(arg1, arg2)
+   Xpath 'b'
+ endfunc
+ 
+ func T75_G()
+   Xpath 'c'
+ endfunc
+ 
+ func T75_H()
+   Xpath 'd'
+ endfunc
+ 
+ func T75_R()
+   while 1
+     try
+       let caught = 0
+       let v:errmsg = ""
+       Xpath 'e'
+       return append(1, "s")
+     catch /E21/
+       let caught = 1
+     catch /.*/
+       Xpath 'f'
+     finally
+       Xpath 'g'
+       if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
+         Xpath 'h'
+       endif
+       break           " discard error for $VIMNOERRTHROW
+     endtry
+   endwhile
+   Xpath 'i'
+ endfunc
+ 
+ func Test_builtin_func_error()
+   XpathINIT
+ 
+   try
+     set noma  " let append() fail with "E21"
+ 
+     while 1
+       try
+         let caught = 0
+         let v:errmsg = ""
+         Xpath 'j'
+         call append(1, "s")
+       catch /E21/
+         let caught = 1
+       catch /.*/
+         Xpath 'k'
+       finally
+         Xpath 'l'
+         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
+           Xpath 'm'
+         endif
+         break         " discard error for $VIMNOERRTHROW
+       endtry
+     endwhile
+ 
+     while 1
+       try
+         let caught = 0
+         let v:errmsg = ""
+         Xpath 'n'
+         call T75_F1('x' . append(1, "s"))
+       catch /E21/
+         let caught = 1
+       catch /.*/
+         Xpath 'o'
+       finally
+         Xpath 'p'
+         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
+           Xpath 'q'
+         endif
+         break         " discard error for $VIMNOERRTHROW
+       endtry
+     endwhile
+ 
+     while 1
+       try
+         let caught = 0
+         let v:errmsg = ""
+         Xpath 'r'
+         call T75_F2('x' . append(1, "s"), T75_G())
+       catch /E21/
+         let caught = 1
+       catch /.*/
+         Xpath 's'
+       finally
+         Xpath 't'
+         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
+           Xpath 'u'
+         endif
+         break         " discard error for $VIMNOERRTHROW
+       endtry
+     endwhile
+ 
+     call T75_R()
+ 
+     while 1
+       try
+         let caught = 0
+         let v:errmsg = ""
+         Xpath 'v'
+         throw "T" . append(1, "s")
+       catch /E21/
+         let caught = 1
+       catch /^T.*/
+         Xpath 'w'
+       catch /.*/
+         Xpath 'x'
+       finally
+         Xpath 'y'
+         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
+           Xpath 'z'
+         endif
+         break         " discard error for $VIMNOERRTHROW
+       endtry
+     endwhile
+ 
+     while 1
+       try
+         let caught = 0
+         let v:errmsg = ""
+         Xpath 'A'
+         let x = "a"
+         let x = x . "b" . append(1, "s") . T75_H()
+       catch /E21/
+         let caught = 1
+       catch /.*/
+         Xpath 'B'
+       finally
+         Xpath 'C'
+         if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
+           Xpath 'D'
+         endif
+         call assert_equal('a', x)
+         break         " discard error for $VIMNOERRTHROW
+       endtry
+     endwhile
+   catch /.*/
+     call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
+   finally
+     set ma&
+   endtry
+ 
+   call assert_equal('jlmnpqrtueghivyzACD', g:Xpath)
+ endfunc
+ 
+ " Modelines                                                               {{{1
+ " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
+ 
"-------------------------------------------------------------------------------
*** ../vim-8.1.2245/src/testdir/test_vimscript.vim      2019-09-08 
18:58:39.557952948 +0200
--- src/testdir/test_vimscript.vim      2019-11-03 16:09:05.321249714 +0100
***************
*** 923,928 ****
--- 923,1122 ----
  endfunc
  
  
"-------------------------------------------------------------------------------
+ " Test 16:  Double :else or :elseif after :else                               
    {{{1
+ "
+ "         Multiple :elses or an :elseif after an :else are forbidden.
+ 
"-------------------------------------------------------------------------------
+ 
+ func T16_F() abort
+   if 0
+     Xpath 'a'
+   else
+     Xpath 'b'
+   else                " aborts function
+     Xpath 'c'
+   endif
+   Xpath 'd'
+ endfunc
+ 
+ func T16_G() abort
+   if 0
+     Xpath 'a'
+   else
+     Xpath 'b'
+   elseif 1            " aborts function
+     Xpath 'c'
+   else
+     Xpath 'd'
+   endif
+   Xpath 'e'
+ endfunc
+ 
+ func T16_H() abort
+   if 0
+     Xpath 'a'
+   elseif 0
+     Xpath 'b'
+   else
+     Xpath 'c'
+   else                " aborts function
+     Xpath 'd'
+   endif
+   Xpath 'e'
+ endfunc
+ 
+ func T16_I() abort
+   if 0
+     Xpath 'a'
+   elseif 0
+     Xpath 'b'
+   else
+     Xpath 'c'
+   elseif 1            " aborts function
+     Xpath 'd'
+   else
+     Xpath 'e'
+   endif
+   Xpath 'f'
+ endfunc
+ 
+ func Test_Multi_Else()
+   XpathINIT
+   try
+     call T16_F()
+   catch /E583:/
+     Xpath 'e'
+   endtry
+   call assert_equal('be', g:Xpath)
+ 
+   XpathINIT
+   try
+     call T16_G()
+   catch /E584:/
+     Xpath 'f'
+   endtry
+   call assert_equal('bf', g:Xpath)
+ 
+   XpathINIT
+   try
+     call T16_H()
+   catch /E583:/
+     Xpath 'f'
+   endtry
+   call assert_equal('cf', g:Xpath)
+ 
+   XpathINIT
+   try
+     call T16_I()
+   catch /E584:/
+     Xpath 'g'
+   endtry
+   call assert_equal('cg', g:Xpath)
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ " Test 17:  Nesting of unmatched :if or :endif inside a :while                
    {{{1
+ "
+ "         The :while/:endwhile takes precedence in nesting over an unclosed
+ "         :if or an unopened :endif.
+ 
"-------------------------------------------------------------------------------
+ 
+ " While loops inside a function are continued on error.
+ func T17_F()
+   let loops = 3
+   while loops > 0
+     let loops -= 1
+     Xpath 'a' . loops
+     if (loops == 1)
+       Xpath 'b' . loops
+       continue
+     elseif (loops == 0)
+       Xpath 'c' . loops
+       break
+     elseif 1
+       Xpath 'd' . loops
+     " endif missing!
+   endwhile    " :endwhile after :if 1
+   Xpath 'e'
+ endfunc
+ 
+ func T17_G()
+   let loops = 2
+   while loops > 0
+     let loops -= 1
+     Xpath 'a' . loops
+     if 0
+       Xpath 'b' . loops
+     " endif missing
+   endwhile    " :endwhile after :if 0
+ endfunc
+ 
+ func T17_H()
+   let loops = 2
+   while loops > 0
+     let loops -= 1
+     Xpath 'a' . loops
+     " if missing!
+     endif     " :endif without :if in while
+     Xpath 'b' . loops
+   endwhile
+ endfunc
+ 
+ " Error continuation outside a function is at the outermost :endwhile or 
:endif.
+ XpathINIT
+ let v:errmsg = ''
+ let loops = 2
+ while loops > 0
+     let loops -= 1
+     Xpath 'a' . loops
+     if 0
+       Xpath 'b' . loops
+     " endif missing! Following :endwhile fails.
+ endwhile | Xpath 'c'
+ Xpath 'd'
+ call assert_match('E171:', v:errmsg)
+ call assert_equal('a1d', g:Xpath)
+ 
+ func Test_unmatched_if_in_while()
+   XpathINIT
+   call assert_fails('call T17_F()', 'E171:')
+   call assert_equal('a2d2a1b1a0c0e', g:Xpath)
+ 
+   XpathINIT
+   call assert_fails('call T17_G()', 'E171:')
+   call assert_equal('a1a0', g:Xpath)
+ 
+   XpathINIT
+   call assert_fails('call T17_H()', 'E580:')
+   call assert_equal('a1b1a0b0', g:Xpath)
+ endfunc
+ 
+ 
"-------------------------------------------------------------------------------
+ 
"-------------------------------------------------------------------------------
+ 
"-------------------------------------------------------------------------------
+ " Test 87   using (expr) ? funcref : funcref                              {{{1
+ "
+ "         Vim needs to correctly parse the funcref and even when it does
+ "         not execute the funcref, it needs to consume the trailing ()
+ 
"-------------------------------------------------------------------------------
+ 
+ func Add2(x1, x2)
+   return a:x1 + a:x2
+ endfu
+ 
+ func GetStr()
+   return "abcdefghijklmnopqrstuvwxyp"
+ endfu
+ 
+ func Test_funcref_with_condexpr()
+   call assert_equal(5, function('Add2')(2,3))
+ 
+   call assert_equal(3, 1 ? function('Add2')(1,2) : function('Add2')(2,3))
+   call assert_equal(5, 0 ? function('Add2')(1,2) : function('Add2')(2,3))
+   " Make sure, GetStr() still works.
+   call assert_equal('abcdefghijk', GetStr()[0:10])
+ endfunc
+ 
  " Test 90:  Recognizing {} in variable name.                      {{{1
  
"-------------------------------------------------------------------------------
  
***************
*** 1752,1756 ****
  
  
"-------------------------------------------------------------------------------
  " Modelines                                                               {{{1
! " vim: ts=8 sw=4 tw=80 fdm=marker
  
"-------------------------------------------------------------------------------
--- 1946,1950 ----
  
  
"-------------------------------------------------------------------------------
  " Modelines                                                               {{{1
! " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
  
"-------------------------------------------------------------------------------
*** ../vim-8.1.2245/src/version.c       2019-11-03 15:46:40.618538702 +0100
--- src/version.c       2019-11-03 16:16:41.571799874 +0100
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     2246,
  /**/

-- 
How To Keep A Healthy Level Of Insanity:
5. Put decaf in the coffee maker for 3 weeks. Once everyone has gotten
   over their caffeine addictions, switch to espresso.

 /// 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/201911031517.xA3FHuSg024358%40masaka.moolenaar.net.

Raspunde prin e-mail lui