changeset 22742:f7f2d73ff85e v8.2.1919

patch 8.2.1919: assert_fails() setting emsg_silent changes normal execution Commit: https://github.com/vim/vim/commit/28ee892ac4197421b3317f195512ca64cc56a5b4 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Oct 28 20:20:00 2020 +0100 patch 8.2.1919: assert_fails() setting emsg_silent changes normal execution Problem: Assert_fails() setting emsg_silent changes normal execution. Solution: Use a separate flag in_assert_fails.
author Bram Moolenaar <Bram@vim.org>
date Wed, 28 Oct 2020 20:30:04 +0100
parents 8c4ba2a7a44f
children 3e5ed12c8908
files src/buffer.c src/change.c src/fileio.c src/globals.h src/insexpand.c src/message.c src/misc1.c src/normal.c src/screen.c src/term.c src/testdir/gen_opt_test.vim src/testdir/test_autocmd.vim src/testdir/test_mapping.vim src/testdir/test_popup.vim src/testdir/test_terminal.vim src/testdir/test_vim9_func.vim src/testing.c src/version.c src/vim9execute.c
diffstat 19 files changed, 44 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -2154,7 +2154,7 @@ buflist_new(
 	if (top_file_num < 0)		// wrap around (may cause duplicates)
 	{
 	    emsg(_("W14: Warning: List of file names overflow"));
-	    if (emsg_silent == 0)
+	    if (emsg_silent == 0 && !in_assert_fails)
 	    {
 		out_flush();
 		ui_delay(3001L, TRUE);	// make sure it is noticed
--- a/src/change.c
+++ b/src/change.c
@@ -115,7 +115,7 @@ changed(void)
 	    // Wait two seconds, to make sure the user reads this unexpected
 	    // message.  Since we could be anywhere, call wait_return() now,
 	    // and don't let the emsg() set msg_scroll.
-	    if (need_wait_return && emsg_silent == 0)
+	    if (need_wait_return && emsg_silent == 0 && !in_assert_fails)
 	    {
 		out_flush();
 		ui_delay(2002L, TRUE);
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -4208,7 +4208,7 @@ buf_check_timestamp(
 			msg_puts_attr(mesg2, HL_ATTR(HLF_W) + MSG_HIST);
 		    msg_clr_eos();
 		    (void)msg_end();
-		    if (emsg_silent == 0)
+		    if (emsg_silent == 0 && !in_assert_fails)
 		    {
 			out_flush();
 #ifdef FEAT_GUI
--- a/src/globals.h
+++ b/src/globals.h
@@ -221,7 +221,6 @@ EXTERN int	emsg_skip INIT(= 0);	    // d
 EXTERN int	emsg_severe INIT(= FALSE);  // use message of next of several
 					    // emsg() calls for throw
 // used by assert_fails()
-EXTERN int	emsg_assert_fails_used INIT(= FALSE);
 EXTERN char_u	*emsg_assert_fails_msg INIT(= NULL);
 EXTERN long	emsg_assert_fails_lnum INIT(= 0);
 EXTERN char_u	*emsg_assert_fails_context INIT(= NULL);
@@ -1130,6 +1129,8 @@ EXTERN int	emsg_silent INIT(= 0);	// don
 EXTERN int	emsg_noredir INIT(= 0);	// don't redirect error messages
 EXTERN int	cmd_silent INIT(= FALSE); // don't echo the command line
 
+EXTERN int	in_assert_fails INIT(= FALSE);	// assert_fails() active
+
 EXTERN int	swap_exists_action INIT(= SEA_NONE);
 					// For dialog when swap file already
 					// exists.
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -298,7 +298,7 @@ has_compl_option(int dict_opt)
 	msg_attr(dict_opt ? _("'dictionary' option is empty")
 			  : _("'thesaurus' option is empty"),
 							      HL_ATTR(HLF_E));
-	if (emsg_silent == 0)
+	if (emsg_silent == 0 && !in_assert_fails)
 	{
 	    vim_beep(BO_COMPL);
 	    setcursor();
--- a/src/message.c
+++ b/src/message.c
@@ -659,7 +659,7 @@ emsg_core(char_u *s)
 	    return TRUE;
 	}
 
-	if (emsg_assert_fails_used && emsg_assert_fails_msg == NULL)
+	if (in_assert_fails && emsg_assert_fails_msg == NULL)
 	{
 	    emsg_assert_fails_msg = vim_strsave(s);
 	    emsg_assert_fails_lnum = SOURCING_LNUM;
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -1063,7 +1063,7 @@ vim_beep(
     called_vim_beep = TRUE;
 #endif
 
-    if (emsg_silent == 0)
+    if (emsg_silent == 0 && !in_assert_fails)
     {
 	if (!((bo_flags & val) || (bo_flags & BO_ALL)))
 	{
@@ -2568,6 +2568,7 @@ goto_im(void)
  * But don't allow a space in the path, so that this works:
  *   "/usr/bin/csh --rcfile ~/.cshrc"
  * But don't do that for Windows, it's common to have a space in the path.
+ * Returns NULL when out of memory.
  */
     char_u *
 get_isolated_shell_name(void)
--- a/src/normal.c
+++ b/src/normal.c
@@ -1154,6 +1154,7 @@ getcount:
 	    && stuff_empty()
 	    && typebuf_typed()
 	    && emsg_silent == 0
+	    && !in_assert_fails
 	    && !did_wait_return
 	    && oap->op_type == OP_NOP)
     {
--- a/src/screen.c
+++ b/src/screen.c
@@ -2490,7 +2490,8 @@ check_for_delay(int check_msg_scroll)
 {
     if ((emsg_on_display || (check_msg_scroll && msg_scroll))
 	    && !did_wait_return
-	    && emsg_silent == 0)
+	    && emsg_silent == 0
+	    && !in_assert_fails)
     {
 	out_flush();
 	ui_delay(1006L, TRUE);
--- a/src/term.c
+++ b/src/term.c
@@ -1800,7 +1800,7 @@ report_default_term(char_u *term)
     mch_errmsg(_("defaulting to '"));
     mch_errmsg((char *)term);
     mch_errmsg("'\r\n");
-    if (emsg_silent == 0)
+    if (emsg_silent == 0 && !in_assert_fails)
     {
 	screen_start();	// don't know where cursor is now
 	out_flush();
--- a/src/testdir/gen_opt_test.vim
+++ b/src/testdir/gen_opt_test.vim
@@ -200,8 +200,8 @@ while 1
       " setting an option can only fail when it's implemented.
       call add(script, "if exists('+" . name . "')")
       for val in a[1]
-	call add(script, "call assert_fails('set " . name . "=" . val . "')")
-	call add(script, "call assert_fails('set " . shortname . "=" . val . "')")
+	call add(script, "silent! call assert_fails('set " . name . "=" . val . "')")
+	call add(script, "silent! call assert_fails('set " . shortname . "=" . val . "')")
       endfor
       call add(script, "endif")
     endif
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -194,7 +194,7 @@ func Test_autocmd_bufunload_avoiding_SEG
     exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
   augroup END
 
-  call assert_fails('edit bb.txt', ['E937:', 'E517:'])
+  call assert_fails('edit bb.txt', 'E937:')
 
   autocmd! test_autocmd_bufunload
   augroup! test_autocmd_bufunload
@@ -1768,7 +1768,7 @@ endfunc
 func Test_nocatch_wipe_all_buffers()
   " Real nasty autocommand: wipe all buffers on any event.
   au * * bwipe *
-  call assert_fails('next x', ['E94:', 'E517:'])
+  call assert_fails('next x', ['E94:', 'E937:'])
   bwipe
   au!
 endfunc
--- a/src/testdir/test_mapping.vim
+++ b/src/testdir/test_mapping.vim
@@ -681,7 +681,7 @@ func Test_expr_abbr()
   " invalid <expr> abbreviation
   abbr <expr> hte GetAbbr()
   call assert_fails('normal ihte ', 'E117:')
-  call assert_equal(' ', getline(1))
+  call assert_equal('', getline(1))
   unabbr <expr> hte
 
   close!
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -344,7 +344,7 @@ func Test_completefunc_opens_new_window_
   /^one
   call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E578:')
   call assert_equal(winid, win_getid())
-  call assert_equal('oneDEF', getline(1))
+  call assert_equal('onedef', getline(1))
   q!
 endfunc
 
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -65,7 +65,7 @@ func Test_terminal_make_change()
 
   setlocal modifiable
   exe "normal Axxx\<Esc>"
-  call assert_fails(buf . 'bwipe', ['E89:', 'E517:'])
+  call assert_fails(buf . 'bwipe', 'E89:')
   undo
 
   exe buf . 'bwipe'
@@ -89,7 +89,7 @@ endfunc
 
 func Test_terminal_wipe_buffer()
   let buf = Run_shell_in_terminal({})
-  call assert_fails(buf . 'bwipe', ['E89:', 'E517:'])
+  call assert_fails(buf . 'bwipe', 'E89:')
   exe buf . 'bwipe!'
   call WaitForAssert({-> assert_equal('dead', job_status(g:job))})
   call assert_equal("", bufname(buf))
@@ -648,7 +648,7 @@ endfunc
 
 func Test_terminal_list_args()
   let buf = term_start([&shell, &shellcmdflag, 'echo "123"'])
-  call assert_fails(buf . 'bwipe', ['E89:', 'E517:'])
+  call assert_fails(buf . 'bwipe', 'E89:')
   exe buf . 'bwipe!'
   call assert_equal("", bufname(buf))
 endfunction
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -1467,14 +1467,14 @@ def SilentlyError()
   g:did_it = 'yes'
 enddef
 
-"func UserError()
-"  silent! invalid
-"endfunc
-"
-"def SilentlyUserError()
-"  UserError()
-"  g:did_it = 'yes'
-"enddef
+func UserError()
+  silent! invalid
+endfunc
+
+def SilentlyUserError()
+  UserError()
+  g:did_it = 'yes'
+enddef
 
 " This can't be a :def function, because the assert would not be reached.
 " And this must not be inside a try/endtry.
@@ -1483,10 +1483,9 @@ func Test_ignore_silent_error()
   call SilentlyError()
   call assert_equal('yes', g:did_it)
 
-"  this doesn't work yet
-"  let g:did_it = 'no'
-"  call SilentlyUserError()
-"  call assert_equal('yes', g:did_it)
+  let g:did_it = 'no'
+  call SilentlyUserError()
+  call assert_equal('yes', g:did_it)
 
   unlet g:did_it
 endfunc
--- a/src/testing.c
+++ b/src/testing.c
@@ -555,8 +555,7 @@ f_assert_fails(typval_T *argvars, typval
     // trylevel must be zero for a ":throw" command to be considered failed
     trylevel = 0;
     suppress_errthrow = TRUE;
-    emsg_silent = TRUE;
-    emsg_assert_fails_used = TRUE;
+    in_assert_fails = TRUE;
 
     do_cmdline_cmd(cmd);
     if (called_emsg == called_emsg_before)
@@ -679,9 +678,13 @@ f_assert_fails(typval_T *argvars, typval
 theend:
     trylevel = save_trylevel;
     suppress_errthrow = FALSE;
-    emsg_silent = FALSE;
+    in_assert_fails = FALSE;
+    did_emsg = FALSE;
+    msg_col = 0;
+    need_wait_return = FALSE;
     emsg_on_display = FALSE;
-    emsg_assert_fails_used = FALSE;
+    msg_scrolled = 0;
+    lines_left = Rows;
     VIM_CLEAR(emsg_assert_fails_msg);
     set_vim_var_string(VV_ERRMSG, NULL, 0);
     if (wrong_arg_msg != NULL)
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1919,
+/**/
     1918,
 /**/
     1917,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -582,7 +582,7 @@ call_ufunc(ufunc_T *ufunc, int argcount,
     funcexe_T   funcexe;
     int		error;
     int		idx;
-    int		called_emsg_before = called_emsg;
+    int		did_emsg_before = did_emsg;
 
     if (ufunc->uf_def_status == UF_TO_BE_COMPILED
 	    && compile_def_function(ufunc, FALSE, NULL) == FAIL)
@@ -620,7 +620,7 @@ call_ufunc(ufunc_T *ufunc, int argcount,
 	user_func_error(error, ufunc->uf_name);
 	return FAIL;
     }
-    if (called_emsg > called_emsg_before)
+    if (did_emsg > did_emsg_before)
 	// Error other than from calling the function itself.
 	return FAIL;
     return OK;