Patch 8.2.1528

5 views
Skip to first unread message

Bram Moolenaar

unread,
Aug 27, 2020, 4:43:37 PM8/27/20
to vim...@googlegroups.com

Patch 8.2.1528
Problem: Vim9: :endif not found after "if false".
Solution: When skipping still check for a following command. (closes #6797)
Files: src/vim9compile.c, src/testdir/test_vim9_script.vim


*** ../vim-8.2.1527/src/vim9compile.c 2020-08-23 19:34:44.722827763 +0200
--- src/vim9compile.c 2020-08-27 22:42:29.184217967 +0200
***************
*** 4014,4019 ****
--- 4014,4026 ----
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,6741 ****

p = skipwhite(p);

! if (cctx.ctx_skip == SKIP_YES
! && ea.cmdidx != CMD_if
&& 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
&& ea.cmdidx != CMD_endwhile
--- 6731,6739 ----

p = skipwhite(p);

! if (cctx.ctx_had_return
&& ea.cmdidx != CMD_elseif
&& ea.cmdidx != CMD_else
&& ea.cmdidx != CMD_endif
&& ea.cmdidx != CMD_endfor
&& ea.cmdidx != CMD_endwhile
***************
*** 6743,6753 ****
&& ea.cmdidx != CMD_finally
&& ea.cmdidx != CMD_endtry)
{
! if (cctx.ctx_had_return)
! {
! emsg(_(e_unreachable_code_after_return));
! goto erret;
! }
}

switch (ea.cmdidx)
--- 6741,6748 ----
&& ea.cmdidx != CMD_finally
&& ea.cmdidx != CMD_endtry)
{
! emsg(_(e_unreachable_code_after_return));
! goto erret;
}

switch (ea.cmdidx)
***************
*** 6845,6851 ****
if (compile_expr0(&p, &cctx) == FAIL)
goto erret;

! // drop the return value
generate_instr_drop(&cctx, ISN_DROP, 1);

line = skipwhite(p);
--- 6840,6846 ----
if (compile_expr0(&p, &cctx) == FAIL)
goto erret;

! // drop the result
generate_instr_drop(&cctx, ISN_DROP, 1);

line = skipwhite(p);
***************
*** 6859,6865 ****
line = compile_mult_expr(p, ea.cmdidx, &cctx);
break;

! // TODO: other commands with an expression argument

case CMD_append:
case CMD_change:
--- 6854,6860 ----
line = compile_mult_expr(p, ea.cmdidx, &cctx);
break;

! // TODO: any other commands with an expression argument?

case CMD_append:
case CMD_change:
***************
*** 6870,6877 ****
goto erret;

case CMD_SIZE:
! semsg(_(e_invalid_command_str), ea.cmd);
! goto erret;

default:
// Not recognized, execute with do_cmdline_cmd().
--- 6865,6878 ----
goto erret;

case CMD_SIZE:
! 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().
*** ../vim-8.2.1527/src/testdir/test_vim9_script.vim 2020-08-27 21:33:06.982960742 +0200
--- src/testdir/test_vim9_script.vim 2020-08-27 22:41:25.236474721 +0200
***************
*** 2122,2127 ****
--- 2122,2135 ----
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()
*** ../vim-8.2.1527/src/version.c 2020-08-27 21:33:06.982960742 +0200
--- src/version.c 2020-08-27 22:33:48.794443202 +0200
***************
*** 756,757 ****
--- 756,759 ----
{ /* Add new patch number below this line */
+ /**/
+ 1528,
/**/

--
Facepalm statement #4: "3000 year old graves? That's not possible, it's only
2014!"

/// Bram Moolenaar -- Br...@Moolenaar.net -- 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 ///
Reply all
Reply to author
Forward
0 new messages