]> granicus.if.org Git - vim/commitdiff
patch 8.2.3324: Vim9: Cannot use :silent with :endwhile v8.2.3324
authorBram Moolenaar <Bram@vim.org>
Tue, 10 Aug 2021 17:53:01 +0000 (19:53 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 10 Aug 2021 17:53:01 +0000 (19:53 +0200)
Problem:    Vim9: Cannot use :silent with :endwhile.
Solution:   Allow for using the :silent modifier. (closes #8737)

src/ex_docmd.c
src/ex_eval.c
src/proto/ex_docmd.pro
src/testdir/test_vim9_cmd.vim
src/version.c
src/vim9compile.c

index 0f0e627d12f6099fd3b1bc965e9f25fa3cf4ce42..9640c500be1caf6f80257146c46645c664a55e07 100644 (file)
@@ -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;
index 6bc7c18b8459f38f23b5762f48f596a09c41d15f..207defa7f3dc1e3bd420473b7f4658087e83e3cd 100644 (file)
@@ -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)
index f96f8cf782654759549479e079f4d3e66142d265..53714391a777d4acfc7e70a51daaeef8b1275c9e 100644 (file)
@@ -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);
index a6241134a492fdd95fe8cacbba6b80911f26eab5..84cb6d665057739d9c0ea118696345e13cf47465 100644 (file)
@@ -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
index 88dc354e4fa606170ec5e53c0bbde62f1c836eb0..0255bf65d054a7f46924f97566f27262a453fd3b 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3324,
 /**/
     3323,
 /**/
index 6bb109069303a98ff2570869357dc3119815bec9..127d5a69d4d3a756b0377ef9182ceffa139ec842 100644 (file)
@@ -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;