# HG changeset patch # User Bram Moolenaar # Date 1604091603 -3600 # Node ID d235c5fa0bbe1503aedbe6fb5e14575b7c10b3aa # Parent 257a1e77a5ec6995b96c78d7187785e7edb0228b patch 8.2.1928: Vim9: "silent!" not effective when list index is wrong Commit: https://github.com/vim/vim/commit/cd030c4b604bea92311e9c418aefe5143dee9201 Author: Bram Moolenaar Date: Fri Oct 30 21:49:40 2020 +0100 patch 8.2.1928: Vim9: "silent!" not effective when list index is wrong Problem: Vim9: "silent!" not effective when list index is wrong. Solution: Ignore list indes failure when emsg_silent is set. (closes https://github.com/vim/vim/issues/7232) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -1477,7 +1477,6 @@ def SilentlyUserError() enddef " This can't be a :def function, because the assert would not be reached. -" And this must not be inside a try/endtry. func Test_ignore_silent_error() let g:did_it = 'no' call SilentlyError() @@ -1490,6 +1489,23 @@ func Test_ignore_silent_error() unlet g:did_it endfunc +def Test_ignore_silent_error_in_filter() + var lines =<< trim END + vim9script + def Filter(winid: number, key: string): bool + if key == 'o' + silent! eval [][0] + return true + endif + return popup_filter_menu(winid, key) + enddef + + popup_create('popup', #{filter: Filter}) + feedkeys("o\r", 'xnt') + END + CheckScriptSuccess(lines) +enddef + def Fibonacci(n: number): number if n < 2 return n diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1928, +/**/ 1927, /**/ 1926, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2869,6 +2869,10 @@ func_return: continue; on_error: + // If "emsg_silent" is set then ignore the error. + if (did_emsg == did_emsg_before && emsg_silent) + continue; + // If we are not inside a try-catch started here, abort execution. if (trylevel <= trylevel_at_start) goto failed;