@@ -851,6 +851,8 @@ call_def_function(
851851 msglist_T * private_msg_list = NULL ;
852852 cmdmod_T save_cmdmod ;
853853 int restore_cmdmod = FALSE;
854+ int save_emsg_silent_def = emsg_silent_def ;
855+ int save_did_emsg_def = did_emsg_def ;
854856 int trylevel_at_start = trylevel ;
855857 int orig_funcdepth ;
856858
@@ -1021,6 +1023,11 @@ call_def_function(
10211023 // Do turn errors into exceptions.
10221024 suppress_errthrow = FALSE;
10231025
1026+ // When ":silent!" was used before calling then we still abort the
1027+ // function. If ":silent!" is used in the function then we don't.
1028+ emsg_silent_def = emsg_silent ;
1029+ did_emsg_def = 0 ;
1030+
10241031 // Decide where to start execution, handles optional arguments.
10251032 init_instr_idx (ufunc , argc , & ectx );
10261033
@@ -3008,8 +3015,10 @@ call_def_function(
30083015
30093016on_error :
30103017 // Jump here for an error that does not require aborting execution.
3011- // If "emsg_silent" is set then ignore the error.
3012- if (did_emsg_cumul + did_emsg == did_emsg_before && emsg_silent )
3018+ // If "emsg_silent" is set then ignore the error, unless it was set
3019+ // when calling the function.
3020+ if (did_emsg_cumul + did_emsg == did_emsg_before
3021+ && emsg_silent && did_emsg_def == 0 )
30133022 continue ;
30143023on_fatal_error :
30153024 // Jump here for an error that messes up the stack.
@@ -3056,6 +3065,8 @@ call_def_function(
30563065 undo_cmdmod (& cmdmod );
30573066 cmdmod = save_cmdmod ;
30583067 }
3068+ emsg_silent_def = save_emsg_silent_def ;
3069+ did_emsg_def += save_did_emsg_def ;
30593070
30603071failed_early :
30613072 // Free all local variables, but not arguments.
0 commit comments