summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ex_docmd.c10
-rw-r--r--src/ex_eval.c12
-rw-r--r--src/proto/ex_docmd.pro6
-rw-r--r--src/testdir/test_vim9_cmd.vim18
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c2
6 files changed, 34 insertions, 16 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 0f0e627d12..9640c500be 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3061,9 +3061,11 @@ parse_command_modifiers(
* Return TRUE if "cmod" has anything set.
*/
int
-has_cmdmod(cmdmod_T *cmod)
+has_cmdmod(cmdmod_T *cmod, int ignore_silent)
{
- return cmod->cmod_flags != 0
+ return (cmod->cmod_flags != 0 && (!ignore_silent
+ || (cmod->cmod_flags
+ & ~(CMOD_SILENT | CMOD_ERRSILENT | CMOD_UNSILENT)) != 0))
|| cmod->cmod_split != 0
|| cmod->cmod_verbose != 0
|| cmod->cmod_tab != 0
@@ -3074,9 +3076,9 @@ has_cmdmod(cmdmod_T *cmod)
* If Vim9 script and "cmdmod" has anything set give an error and return TRUE.
*/
int
-cmdmod_error(void)
+cmdmod_error(int ignore_silent)
{
- if (in_vim9script() && has_cmdmod(&cmdmod))
+ if (in_vim9script() && has_cmdmod(&cmdmod, ignore_silent))
{
emsg(_(e_misplaced_command_modifier));
return TRUE;
diff --git a/src/ex_eval.c b/src/ex_eval.c
index 6bc7c18b84..207defa7f3 100644
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -1026,7 +1026,7 @@ ex_endif(exarg_T *eap)
{
cstack_T *cstack = eap->cstack;
- if (cmdmod_error())
+ if (cmdmod_error(FALSE))
return;
did_endif = TRUE;
if (cstack->cs_idx < 0
@@ -1355,7 +1355,7 @@ ex_endwhile(exarg_T *eap)
int csf;
int fl;
- if (cmdmod_error())
+ if (cmdmod_error(TRUE))
return;
if (eap->cmdidx == CMD_endwhile)
@@ -1593,7 +1593,7 @@ ex_try(exarg_T *eap)
int skip;
cstack_T *cstack = eap->cstack;
- if (cmdmod_error())
+ if (cmdmod_error(FALSE))
return;
if (cstack->cs_idx == CSTACK_LEN - 1)
@@ -1674,7 +1674,7 @@ ex_catch(exarg_T *eap)
cstack_T *cstack = eap->cstack;
char_u *pat;
- if (cmdmod_error())
+ if (cmdmod_error(FALSE))
return;
if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0)
@@ -1839,7 +1839,7 @@ ex_finally(exarg_T *eap)
int pending = CSTP_NONE;
cstack_T *cstack = eap->cstack;
- if (cmdmod_error())
+ if (cmdmod_error(FALSE))
return;
if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0)
@@ -1971,7 +1971,7 @@ ex_endtry(exarg_T *eap)
void *rettv = NULL;
cstack_T *cstack = eap->cstack;
- if (cmdmod_error())
+ if (cmdmod_error(FALSE))
return;
if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0)
diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro
index f96f8cf782..53714391a7 100644
--- a/src/proto/ex_docmd.pro
+++ b/src/proto/ex_docmd.pro
@@ -10,8 +10,8 @@ char *ex_errmsg(char *msg, char_u *arg);
int checkforcmd(char_u **pp, char *cmd, int len);
int checkforcmd_noparen(char_u **pp, char *cmd, int len);
int parse_command_modifiers(exarg_T *eap, char **errormsg, cmdmod_T *cmod, int skip_only);
-int has_cmdmod(cmdmod_T *cmod);
-int cmdmod_error(void);
+int has_cmdmod(cmdmod_T *cmod, int ignore_silent);
+int cmdmod_error(int ignore_silent);
void apply_cmdmod(cmdmod_T *cmod);
void undo_cmdmod(cmdmod_T *cmod);
int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
@@ -32,7 +32,7 @@ int ends_excmd(int c);
int ends_excmd2(char_u *cmd_start, char_u *cmd);
char_u *find_nextcmd(char_u *p);
char_u *check_nextcmd(char_u *p);
-void set_nextcmd(exarg_T *eap, char_u *p);
+void set_nextcmd(exarg_T *eap, char_u *arg);
char_u *get_command_name(expand_T *xp, int idx);
void not_exiting(void);
int before_quit_autocmds(win_T *wp, int quit_all, int forceit);
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index a6241134a4..84cb6d6650 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -807,6 +807,17 @@ def Test_modifier_silent_unsilent()
echomsg "caught"
endtry
assert_equal("\ncaught", execute(':1messages'))
+
+ var lines =<< trim END
+ vim9script
+ set history=11
+ silent! while 0
+ set history=22
+ silent! endwhile
+ assert_equal(11, &history)
+ set history&
+ END
+ CheckScriptSuccess(lines)
enddef
def Test_range_after_command_modifier()
@@ -836,13 +847,16 @@ def Test_useless_command_modifier()
for i in [0]
silent endfor
END
- CheckDefAndScriptFailure(lines, 'E1176:', 2)
+ CheckDefFailure(lines, 'E1176:', 2)
+ CheckScriptSuccess(['vim9script'] + lines)
lines =<< trim END
while g:maybe
silent endwhile
END
- CheckDefAndScriptFailure(lines, 'E1176:', 2)
+ CheckDefFailure(lines, 'E1176:', 2)
+ g:maybe = false
+ CheckScriptSuccess(['vim9script'] + lines)
lines =<< trim END
silent try
diff --git a/src/version.c b/src/version.c
index 88dc354e4f..0255bf65d0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3324,
+/**/
3323,
/**/
3322,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 6bb1090693..127d5a69d4 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -2344,7 +2344,7 @@ generate_cmdmods(cctx_T *cctx, cmdmod_T *cmod)
{
isn_T *isn;
- if (has_cmdmod(cmod))
+ if (has_cmdmod(cmod, FALSE))
{
cctx->ctx_has_cmdmod = TRUE;