summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-10-28 20:20:00 +0100
committerBram Moolenaar <Bram@vim.org>2020-10-28 20:20:00 +0100
commit28ee892ac4197421b3317f195512ca64cc56a5b4 (patch)
tree0a9eb799ec0e55a32600cc604cea653d9b91f322 /src
parent3e2534ed1a6557445747e6c1439ad26ec8eabfc4 (diff)
downloadvim-git-28ee892ac4197421b3317f195512ca64cc56a5b4.tar.gz
patch 8.2.1919: assert_fails() setting emsg_silent changes normal executionv8.2.1919
Problem: Assert_fails() setting emsg_silent changes normal execution. Solution: Use a separate flag in_assert_fails.
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c2
-rw-r--r--src/change.c2
-rw-r--r--src/fileio.c2
-rw-r--r--src/globals.h3
-rw-r--r--src/insexpand.c2
-rw-r--r--src/message.c2
-rw-r--r--src/misc1.c3
-rw-r--r--src/normal.c1
-rw-r--r--src/screen.c3
-rw-r--r--src/term.c2
-rw-r--r--src/testdir/gen_opt_test.vim4
-rw-r--r--src/testdir/test_autocmd.vim4
-rw-r--r--src/testdir/test_mapping.vim2
-rw-r--r--src/testdir/test_popup.vim2
-rw-r--r--src/testdir/test_terminal.vim6
-rw-r--r--src/testdir/test_vim9_func.vim23
-rw-r--r--src/testing.c11
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c4
19 files changed, 44 insertions, 36 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 5cbaaac9c..c804348e1 100644
--- 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
diff --git a/src/change.c b/src/change.c
index 45780573d..50dc10543 100644
--- 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);
diff --git a/src/fileio.c b/src/fileio.c
index 9eecb0108..27e9aaecf 100644
--- 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
diff --git a/src/globals.h b/src/globals.h
index 5495eac13..5bdbad636 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -221,7 +221,6 @@ EXTERN int emsg_skip INIT(= 0); // don't display errors for
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't print error messages
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.
diff --git a/src/insexpand.c b/src/insexpand.c
index 87aaf7d6b..7e61e618b 100644
--- 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();
diff --git a/src/message.c b/src/message.c
index 8c8e954d5..f8efabc80 100644
--- 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;
diff --git a/src/misc1.c b/src/misc1.c
index 058e8602d..010622ee5 100644
--- 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)
diff --git a/src/normal.c b/src/normal.c
index 89eaabccc..af4d3b288 100644
--- 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)
{
diff --git a/src/screen.c b/src/screen.c
index 0b117cd84..6e907cdf4 100644
--- 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);
diff --git a/src/term.c b/src/term.c
index be6d531b9..4d4cc589d 100644
--- 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();
diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/gen_opt_test.vim
index 271abedce..600a79080 100644
--- 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
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 639f9eb67..1e8711c6b 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -194,7 +194,7 @@ func Test_autocmd_bufunload_avoiding_SEGV_01()
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
diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim
index 67a908a5a..5bec95a11 100644
--- 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!
diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim
index 381a2c19b..28481b3a2 100644
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -344,7 +344,7 @@ func Test_completefunc_opens_new_window_one()
/^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
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 676d864c7..829706c93 100644
--- 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
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 919af7411..4ec0f6fdb 100644
--- 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
diff --git a/src/testing.c b/src/testing.c
index 811544103..919b91182 100644
--- a/src/testing.c
+++ b/src/testing.c
@@ -555,8 +555,7 @@ f_assert_fails(typval_T *argvars, typval_T *rettv)
// 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_T *rettv)
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)
diff --git a/src/version.c b/src/version.c
index a7508cae9..2aa5b0d94 100644
--- 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,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index c428a3d55..09eb6c221 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -582,7 +582,7 @@ call_ufunc(ufunc_T *ufunc, int argcount, ectx_T *ectx, isn_T *iptr)
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, ectx_T *ectx, isn_T *iptr)
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;