]> granicus.if.org Git - vim/commitdiff
patch 8.2.1528: Vim9: :endif not found after "if false" v8.2.1528
authorBram Moolenaar <Bram@vim.org>
Thu, 27 Aug 2020 20:43:03 +0000 (22:43 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 27 Aug 2020 20:43:03 +0000 (22:43 +0200)
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
src/version.c
src/vim9compile.c

index 952b67522dfb85cbbdfcc9b001334308a6beb893..054fe4cbfc16c379dc83dd6076b9d1156ddfc72e 100644 (file)
@@ -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()
index 0b63281873c7e8b05805463bcf66800e5f4f0917..fed8f1411a2906401773120ff7b92ff838b3d7fb 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1528,
 /**/
     1527,
 /**/
index 2c3dc70d6d420cd5710a897ab9105615c2e81467..3e9b42c8547e3bc0ad1b0bdbd5d24437484f442f 100644 (file)
@@ -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().