Mercurial > vim
diff src/vim9cmds.c @ 27084:6fc63c6a7ee7 v8.2.4071
patch 8.2.4071: Vim9: no detection of return in try/endtry
Commit: https://github.com/vim/vim/commit/53c296112edd8471eb63afbca03f96bad164c813
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Jan 12 16:18:18 2022 +0000
patch 8.2.4071: Vim9: no detection of return in try/endtry
Problem: Vim9: no detection of return in try/endtry. (Dominique Pell?)
Solution: Check if any of the blocks inside try/endtry did not end in
return.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 12 Jan 2022 17:30:07 +0100 |
parents | 8dc4782b60ff |
children | 47dbeda35910 |
line wrap: on
line diff
--- a/src/vim9cmds.c +++ b/src/vim9cmds.c @@ -1343,6 +1343,8 @@ compile_catch(char_u *arg, cctx_T *cctx emsg(_(e_catch_unreachable_after_catch_all)); return NULL; } + if (!cctx->ctx_had_return) + scope->se_u.se_try.ts_no_return = TRUE; if (cctx->ctx_skip != SKIP_YES) { @@ -1498,6 +1500,7 @@ compile_finally(char_u *arg, cctx_T *cct isn->isn_arg.jump.jump_where = this_instr; scope->se_u.se_try.ts_catch_label = 0; } + scope->se_u.se_try.ts_has_finally = TRUE; if (generate_instr(cctx, ISN_FINALLY) == NULL) return NULL; } @@ -1567,6 +1570,14 @@ compile_endtry(char_u *arg, cctx_T *cctx } } + // If there is a finally clause that ends in return then we will return. + // If one of the blocks didn't end in "return" or we did not catch all + // exceptions reset the had_return flag. + if (!(scope->se_u.se_try.ts_has_finally && cctx->ctx_had_return) + && (scope->se_u.se_try.ts_no_return + || !scope->se_u.se_try.ts_caught_all)) + cctx->ctx_had_return = FALSE; + compile_endblock(cctx); if (cctx->ctx_skip != SKIP_YES)