summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-04-20 19:42:10 +0200
committerBram Moolenaar <Bram@vim.org>2020-04-20 19:42:10 +0200
commit2c5ed4e3300378ce76c8d9c3818d6f73e5119f68 (patch)
tree1fa5e72a63e160710ee6fd59fef09c8f334d0808
parentfaac410409a8d693a0326ad9db42dca85419a391 (diff)
patch 8.2.0612: Vim9: no check for space before #commentv8.2.0612
Problem: Vim9: no check for space before #comment. Solution: Add space checks.
-rw-r--r--src/ex_cmds.c7
-rw-r--r--src/ex_eval.c11
-rw-r--r--src/gui.c4
-rw-r--r--src/highlight.c2
-rw-r--r--src/proto/regexp.pro3
-rw-r--r--src/regexp.c26
-rw-r--r--src/testdir/test_sort.vim2
-rw-r--r--src/testdir/test_vim9_script.vim58
-rw-r--r--src/version.c2
9 files changed, 96 insertions, 19 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index bd114631bb..f38bdacb63 100644
--- 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
index 7ffc145ae4..4aa2658361 100644
--- 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
index cdfc929e9f..5959043279 100644
--- 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
index ee2e43754d..9476a7ddac 100644
--- 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
index 27ba8e59a0..d3a7754151 100644
--- 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
index 3911c90616..c222d9c2ee 100644
--- 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, 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)
{
- return skip_regexp_ex(startp, dirc, magic, NULL, NULL);
+ 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
index 92e8f49d48..aa74a92d0c 100644
--- 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
index 70653f0332..a541d8808d 100644
--- 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
index d051d79c8d..de9413b8c0 100644
--- 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,