# HG changeset patch # User Bram Moolenaar # Date 1587404703 -7200 # Node ID 2c23053c654ad789aead47fd066f230ee4ba46f9 # Parent b209e0dd46a4c2b35d125178d57fe1f669268141 patch 8.2.0612: Vim9: no check for space before #comment Commit: https://github.com/vim/vim/commit/2c5ed4e3300378ce76c8d9c3818d6f73e5119f68 Author: Bram Moolenaar Date: Mon Apr 20 19:42:10 2020 +0200 patch 8.2.0612: Vim9: no check for space before #comment Problem: Vim9: no check for space before #comment. Solution: Add space checks. diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -451,12 +451,9 @@ ex_sort(exarg_T *eap) } else if (!ASCII_ISALPHA(*p) && regmatch.regprog == NULL) { - s = skip_regexp(p + 1, *p, TRUE); - if (*s != *p) - { - emsg(_(e_invalpat)); + s = skip_regexp_err(p + 1, *p, TRUE); + if (s == NULL) goto sortend; - } *s = NUL; // Use last search pattern if sort pattern is empty. if (s == p + 1) diff --git a/src/ex_eval.c b/src/ex_eval.c --- a/src/ex_eval.c +++ b/src/ex_eval.c @@ -1021,12 +1021,12 @@ ex_else(exarg_T *eap) if (eap->cmdidx == CMD_elseif) { result = eval_to_bool(eap->arg, &error, &eap->nextcmd, skip); + // When throwing error exceptions, we want to throw always the first // of several errors in a row. This is what actually happens when // a conditional error was detected above and there is another failure // when parsing the expression. Since the skip flag is set in this // case, the parsing error will be ignored by emsg(). - if (!skip && !error) { if (result) @@ -1518,7 +1518,7 @@ ex_catch(exarg_T *eap) &cstack->cs_looplevel); } - if (ends_excmd(*eap->arg)) // no argument, catch all errors + if (ends_excmd2(eap->cmd, eap->arg)) // no argument, catch all errors { pat = (char_u *)".*"; end = NULL; @@ -1527,7 +1527,9 @@ ex_catch(exarg_T *eap) else { pat = eap->arg + 1; - end = skip_regexp(pat, *eap->arg, TRUE); + end = skip_regexp_err(pat, *eap->arg, TRUE); + if (end == NULL) + give_up = TRUE; } if (!give_up) @@ -1548,7 +1550,8 @@ ex_catch(exarg_T *eap) if (!skip && (cstack->cs_flags[idx] & CSF_THROWN) && !(cstack->cs_flags[idx] & CSF_CAUGHT)) { - if (end != NULL && *end != NUL && !ends_excmd(*skipwhite(end + 1))) + if (end != NULL && *end != NUL + && !ends_excmd2(end, skipwhite(end + 1))) { emsg(_(e_trailing)); return; diff --git a/src/gui.c b/src/gui.c --- a/src/gui.c +++ b/src/gui.c @@ -5036,7 +5036,7 @@ ex_gui(exarg_T *eap) // of the argument ending up after the shell prompt. msg_clr_eos_force(); #ifdef GUI_MAY_SPAWN - if (!ends_excmd(*eap->arg)) + if (!ends_excmd2(eap->cmd, eap->arg)) gui_start(eap->arg); else #endif @@ -5045,7 +5045,7 @@ ex_gui(exarg_T *eap) channel_gui_register_all(); #endif } - if (!ends_excmd(*eap->arg)) + if (!ends_excmd2(eap->cmd, eap->arg)) ex_next(eap); } diff --git a/src/highlight.c b/src/highlight.c --- a/src/highlight.c +++ b/src/highlight.c @@ -658,7 +658,7 @@ do_highlight( /* * If no argument, list current highlighting. */ - if (ends_excmd(*line)) + if (!init && ends_excmd2(line - 1, line)) { for (i = 1; i <= highlight_ga.ga_len && !got_int; ++i) // TODO: only call when the group has attributes set diff --git a/src/proto/regexp.pro b/src/proto/regexp.pro --- a/src/proto/regexp.pro +++ b/src/proto/regexp.pro @@ -1,6 +1,7 @@ /* regexp.c */ int re_multiline(regprog_T *prog); -char_u *skip_regexp(char_u *startp, int dirc, int magic); +char_u *skip_regexp(char_u *startp, int delim, int magic); +char_u *skip_regexp_err(char_u *startp, int delim, int magic); char_u *skip_regexp_ex(char_u *startp, int dirc, int magic, char_u **newp, int *dropped); reg_extmatch_T *ref_extmatch(reg_extmatch_T *em); void unref_extmatch(reg_extmatch_T *em); diff --git a/src/regexp.c b/src/regexp.c --- a/src/regexp.c +++ b/src/regexp.c @@ -534,17 +534,37 @@ skip_anyof(char_u *p) /* * Skip past regular expression. - * Stop at end of "startp" or where "dirc" is found ('/', '?', etc). + * Stop at end of "startp" or where "delim" is found ('/', '?', etc). * Take care of characters with a backslash in front of it. * Skip strings inside [ and ]. */ char_u * skip_regexp( char_u *startp, - int dirc, + int delim, int magic) { - return skip_regexp_ex(startp, dirc, magic, NULL, NULL); + return skip_regexp_ex(startp, delim, magic, NULL, NULL); +} + +/* + * Call skip_regexp() and when the delimiter does not match give an error and + * return NULL. + */ + char_u * +skip_regexp_err( + char_u *startp, + int delim, + int magic) +{ + char_u *p = skip_regexp(startp, delim, magic); + + if (*p != delim) + { + semsg(_("E654: missing delimiter after search pattern: %s"), startp); + return NULL; + } + return p; } /* diff --git a/src/testdir/test_sort.vim b/src/testdir/test_sort.vim --- a/src/testdir/test_sort.vim +++ b/src/testdir/test_sort.vim @@ -1255,7 +1255,7 @@ func Test_sort_cmd() call setline(1, ['line1', 'line2']) call assert_fails('sort no', 'E474:') call assert_fails('sort c', 'E475:') - call assert_fails('sort #pat%', 'E682:') + call assert_fails('sort #pat%', 'E654:') enew! endfunc diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -1153,22 +1153,76 @@ def Test_vim9_comment() CheckDefFailure([ 'try# comment', - 'echo "yes"', + ' echo "yes"', 'catch', 'endtry', ], 'E488:') + CheckScriptFailure([ + 'vim9script', + 'try# comment', + 'echo "yes"', + ], 'E488:') CheckDefFailure([ 'try', - 'echo "yes"', + ' echo "yes"', 'catch# comment', 'endtry', ], 'E488:') + CheckScriptFailure([ + 'vim9script', + 'try', + ' echo "yes"', + 'catch# comment', + 'endtry', + ], 'E654:') + CheckDefFailure([ + 'try', + ' echo "yes"', + 'catch /pat/# comment', + 'endtry', + ], 'E488:') + CheckScriptFailure([ + 'vim9script', + 'try', + ' throw "pat"', + 'catch /pat/# comment', + 'endtry', + ], 'E605:') CheckDefFailure([ 'try', 'echo "yes"', 'catch', 'endtry# comment', ], 'E488:') + CheckScriptFailure([ + 'vim9script', + 'try', + ' echo "yes"', + 'catch', + 'endtry# comment', + ], 'E600:') + + CheckScriptSuccess([ + 'vim9script', + 'hi # comment', + ]) + CheckScriptFailure([ + 'vim9script', + 'hi# comment', + ], 'E416:') +enddef + +def Test_vim9_comment_gui() + CheckCanRunGui + + CheckScriptFailure([ + 'vim9script', + 'gui#comment' + ], 'E499:') + CheckScriptFailure([ + 'vim9script', + 'gui -f#comment' + ], 'E499:') enddef def Test_vim9_comment_not_compiled() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 612, +/**/ 611, /**/ 610,