diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/ex_eval.c | 12 | ||||
| -rw-r--r-- | src/nvim/testdir/test_trycatch.vim | 21 | 
2 files changed, 30 insertions, 3 deletions
| diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c index b5456e8982..f4aaab5c43 100644 --- a/src/nvim/ex_eval.c +++ b/src/nvim/ex_eval.c @@ -1083,7 +1083,7 @@ void ex_endwhile(exarg_T *eap)    if (cstack->cs_looplevel <= 0 || cstack->cs_idx < 0) {      eap->errmsg = err;    } else { -    fl =  cstack->cs_flags[cstack->cs_idx]; +    fl = cstack->cs_flags[cstack->cs_idx];      if (!(fl & csf)) {        // If we are in a ":while" or ":for" but used the wrong endloop        // command, do not rewind to the next enclosing ":for"/":while". @@ -1575,6 +1575,7 @@ void ex_endtry(exarg_T *eap)      if (!(cstack->cs_flags[cstack->cs_idx] & CSF_TRY)) {        eap->errmsg = get_end_emsg(cstack); +        // Find the matching ":try" and report what's missing.        idx = cstack->cs_idx;        do { @@ -1594,6 +1595,9 @@ void ex_endtry(exarg_T *eap)        if (current_exception) {          discard_current_exception();        } + +      // report eap->errmsg, also when there already was an error +      did_emsg = false;      } else {        idx = cstack->cs_idx; @@ -1664,8 +1668,10 @@ void ex_endtry(exarg_T *eap)       */      (void)cleanup_conditionals(cstack, CSF_TRY | CSF_SILENT, TRUE); -    --cstack->cs_idx; -    --cstack->cs_trylevel; +    if (cstack->cs_idx >= 0 && (cstack->cs_flags[cstack->cs_idx] & CSF_TRY)) { +      cstack->cs_idx--; +    } +    cstack->cs_trylevel--;      if (!skip) {        report_resume_pending(pending, diff --git a/src/nvim/testdir/test_trycatch.vim b/src/nvim/testdir/test_trycatch.vim index 34c402fc73..205ed095ea 100644 --- a/src/nvim/testdir/test_trycatch.vim +++ b/src/nvim/testdir/test_trycatch.vim @@ -2067,5 +2067,26 @@ func Test_error_in_catch_and_finally()    call delete('XtestCatchAndFinally')  endfunc +" This was causing an illegal memory access +func Test_leave_block_in_endtry_not_called() +  let lines =<< trim END +      " vim9script +      " try # +      try " +      for x in [] +      if +      endwhile +      if +      endtry +  END +  call writefile(lines, 'XtestEndtry') +  try +    source XtestEndtry +  catch /E171:/ +  endtry + +  call delete('XtestEndtry') +endfunc +  " Modeline								    {{{1  " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker | 
