From 3988f64f9d512fd809d4a600b020638bf2c7d7ec Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 27 Aug 2020 22:43:03 +0200 Subject: patch 8.2.1528: Vim9: :endif not found after "if false" Problem: Vim9: :endif not found after "if false". Solution: When skipping still check for a following command. (closes #6797) --- src/testdir/test_vim9_script.vim | 8 ++++++++ src/version.c | 2 ++ src/vim9compile.c | 39 ++++++++++++++++++++------------------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 952b67522d..054fe4cbfc 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -2122,6 +2122,14 @@ def Test_if_const_expr() res = true endif assert_equal(false, res) + + # with constant "false" expression may be invalid so long as the syntax is OK + if false | eval 0 | endif + if false | eval burp + 234 | endif + if false | echo burp 234 'asd' | endif + if false + burp + endif enddef def Test_if_const_expr_fails() diff --git a/src/version.c b/src/version.c index 0b63281873..fed8f1411a 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1528, /**/ 1527, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 2c3dc70d6d..3e9b42c854 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -4014,6 +4014,13 @@ compile_expr1(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) int ppconst_used = ppconst->pp_used; char_u *next; + // Ignore all kinds of errors when not producing code. + if (cctx->ctx_skip == SKIP_YES) + { + skip_expr(arg); + return OK; + } + // Evaluate the first expression. if (compile_expr2(arg, cctx, ppconst) == FAIL) return FAIL; @@ -6724,17 +6731,8 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) p = skipwhite(p); - if (cctx.ctx_skip == SKIP_YES - && ea.cmdidx != CMD_if + if (cctx.ctx_had_return && ea.cmdidx != CMD_elseif - && ea.cmdidx != CMD_else - && ea.cmdidx != CMD_endif) - { - line = (char_u *)""; - continue; - } - - if (ea.cmdidx != CMD_elseif && ea.cmdidx != CMD_else && ea.cmdidx != CMD_endif && ea.cmdidx != CMD_endfor @@ -6743,11 +6741,8 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) && ea.cmdidx != CMD_finally && ea.cmdidx != CMD_endtry) { - if (cctx.ctx_had_return) - { - emsg(_(e_unreachable_code_after_return)); - goto erret; - } + emsg(_(e_unreachable_code_after_return)); + goto erret; } switch (ea.cmdidx) @@ -6845,7 +6840,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) if (compile_expr0(&p, &cctx) == FAIL) goto erret; - // drop the return value + // drop the result generate_instr_drop(&cctx, ISN_DROP, 1); line = skipwhite(p); @@ -6859,7 +6854,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) line = compile_mult_expr(p, ea.cmdidx, &cctx); break; - // TODO: other commands with an expression argument + // TODO: any other commands with an expression argument? case CMD_append: case CMD_change: @@ -6870,8 +6865,14 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) goto erret; case CMD_SIZE: - semsg(_(e_invalid_command_str), ea.cmd); - goto erret; + if (cctx.ctx_skip != SKIP_YES) + { + semsg(_(e_invalid_command_str), ea.cmd); + goto erret; + } + // We don't check for a next command here. + line = (char_u *)""; + break; default: // Not recognized, execute with do_cmdline_cmd(). -- cgit v1.2.3