Patch 8.2.3162
Problem:    Vim9: argument types are not checked at compile time.
Solution:   Add more type checks. (Yegappan Lakshmanan, closes #8560)
Files:      runtime/doc/channel.txt, src/clientserver.c, src/cmdhist.c,
            src/errors.h, src/evalfunc.c, src/evalwindow.c, src/filepath.c,
            src/globals.h, src/popupwin.c, src/proto/typval.pro, src/sign.c,
            src/strings.c, src/terminal.c, src/testdir/test_normal.vim,
            src/testdir/test_reltime.vim, src/testdir/test_vim9_builtin.vim,
            src/testdir/test_vim9_expr.vim, src/testing.c, src/textprop.c,
            src/time.c, src/typval.c


*** ../vim-8.2.3161/runtime/doc/channel.txt     2021-01-31 17:02:06.246490203 
+0100
--- runtime/doc/channel.txt     2021-07-15 10:53:45.234392528 +0200
***************
*** 852,858 ****
  job_getchannel({job})                                  *job_getchannel()*
                Get the channel handle that {job} is using.
                To check if the job has no channel: >
!                       if string(job_getchannel()) == 'channel fail'
  <
                Can also be used as a |method|: >
                        GetJob()->job_getchannel()
--- 852,858 ----
  job_getchannel({job})                                  *job_getchannel()*
                Get the channel handle that {job} is using.
                To check if the job has no channel: >
!                       if string(job_getchannel(job)) == 'channel fail'
  <
                Can also be used as a |method|: >
                        GetJob()->job_getchannel()
*** ../vim-8.2.3161/src/clientserver.c  2020-06-24 20:33:59.565106319 +0200
--- src/clientserver.c  2021-07-15 10:53:45.234392528 +0200
***************
*** 596,602 ****
      ga_concat(&ga, cdp);
  
      // Call inputsave() so that a prompt for an encryption key works.
!     ga_concat(&ga, (char_u *)"<CR>:if exists('*inputsave')|call 
inputsave()|endif|");
      if (tabs)
        ga_concat(&ga, (char_u *)"tab ");
      ga_concat(&ga, (char_u *)"drop");
--- 596,603 ----
      ga_concat(&ga, cdp);
  
      // Call inputsave() so that a prompt for an encryption key works.
!     ga_concat(&ga, (char_u *)
!                      "<CR>:if exists('*inputsave')|call inputsave()|endif|");
      if (tabs)
        ga_concat(&ga, (char_u *)"tab ");
      ga_concat(&ga, (char_u *)"drop");
***************
*** 621,627 ****
        ga_concat(&ga, p);
        vim_free(p);
      }
!     ga_concat(&ga, (char_u *)"|if exists('*inputrestore')|call 
inputrestore()|endif<CR>");
  
      // The :drop commands goes to Insert mode when 'insertmode' is set, use
      // CTRL-\ CTRL-N again.
--- 622,629 ----
        ga_concat(&ga, p);
        vim_free(p);
      }
!     ga_concat(&ga, (char_u *)
!                 "|if exists('*inputrestore')|call inputrestore()|endif<CR>");
  
      // The :drop commands goes to Insert mode when 'insertmode' is set, use
      // CTRL-\ CTRL-N again.
***************
*** 885,892 ****
      char_u    *r = NULL;
  
  #ifdef FEAT_CLIENTSERVER
!     char_u    *serverid = tv_get_string_chk(&argvars[0]);
  
      if (serverid != NULL && !check_restricted() && !check_secure())
      {
        int timeout = 0;
--- 887,901 ----
      char_u    *r = NULL;
  
  #ifdef FEAT_CLIENTSERVER
!     char_u    *serverid;
! 
!     if (in_vim9script()
!           && (check_for_string_arg(argvars, 0) == FAIL
!               || (argvars[1].v_type != VAR_UNKNOWN
!                   && check_for_number_arg(argvars, 1) == FAIL)))
!       return;
  
+     serverid = tv_get_string_chk(&argvars[0]);
      if (serverid != NULL && !check_restricted() && !check_secure())
      {
        int timeout = 0;
*** ../vim-8.2.3161/src/cmdhist.c       2021-06-02 13:28:11.423120478 +0200
--- src/cmdhist.c       2021-07-15 10:53:45.234392528 +0200
***************
*** 597,602 ****
--- 597,608 ----
      int               idx;
      char_u    *str;
  
+     if (in_vim9script()
+           && (check_for_string_arg(argvars, 0) == FAIL
+               || (argvars[1].v_type != VAR_UNKNOWN
+                   && check_for_number_arg(argvars, 1) == FAIL)))
+       return;
+ 
      str = tv_get_string_chk(&argvars[0]);     // NULL on type error
      if (str == NULL)
        rettv->vval.v_string = NULL;
*** ../vim-8.2.3161/src/errors.h        2021-07-11 16:01:54.468064058 +0200
--- src/errors.h        2021-07-15 10:53:45.234392528 +0200
***************
*** 500,502 ****
--- 500,504 ----
        INIT(= N_("E1208: -complete used without -nargs"));
  EXTERN char e_invalid_value_for_line_number_str[]
        INIT(= N_("E1209: Invalid value for a line number: \"%s\""));
+ EXTERN char e_number_required_for_argument_nr[]
+       INIT(= N_("E1210: Number required for argument %d"));
*** ../vim-8.2.3161/src/evalfunc.c      2021-07-13 20:32:26.255186763 +0200
--- src/evalfunc.c      2021-07-15 10:53:45.238392517 +0200
***************
*** 255,260 ****
--- 255,269 ----
  }
  
  /*
+  * Check "type" is a list of 'any'.
+  */
+     static int
+ arg_list_any(type_T *type, argcontext_T *context)
+ {
+     return check_arg_type(&t_list_any, type, context);
+ }
+ 
+ /*
   * Check "type" is a list of numbers.
   */
      static int
***************
*** 287,295 ****
      static int
  arg_bool(type_T *type, argcontext_T *context)
  {
-     if (type->tt_type == VAR_ANY
-                  || type->tt_type == VAR_NUMBER || type->tt_type == VAR_BOOL)
-       return OK;
      return check_arg_type(&t_bool, type, context);
  }
  
--- 296,301 ----
***************
*** 353,359 ****
  }
  
  /*
!  * Check "type" is a list or a dict.
   */
      static int
  arg_list_or_dict(type_T *type, argcontext_T *context)
--- 359,365 ----
  }
  
  /*
!  * Check "type" is a list of 'any' or a dict of 'any'.
   */
      static int
  arg_list_or_dict(type_T *type, argcontext_T *context)
***************
*** 366,377 ****
  }
  
  /*
   * Check "type" is a channel or a job.
   */
      static int
  arg_chan_or_job(type_T *type, argcontext_T *context)
  {
!     if (type->tt_type == VAR_CHANNEL || type->tt_type == VAR_JOB)
        return OK;
      arg_type_mismatch(&t_channel, type, context->arg_idx + 1);
      return FAIL;
--- 372,393 ----
  }
  
  /*
+  * Check "type" is a job.
+  */
+     static int
+ arg_job(type_T *type, argcontext_T *context)
+ {
+     return check_arg_type(&t_job, type, context);
+ }
+ 
+ /*
   * Check "type" is a channel or a job.
   */
      static int
  arg_chan_or_job(type_T *type, argcontext_T *context)
  {
!     if (type->tt_type == VAR_ANY ||
!           type->tt_type == VAR_CHANNEL || type->tt_type == VAR_JOB)
        return OK;
      arg_type_mismatch(&t_channel, type, context->arg_idx + 1);
      return FAIL;
***************
*** 459,496 ****
  /*
   * Lists of functions that check the argument types of a builtin function.
   */
! argcheck_T arg1_string[] = {arg_string};
! argcheck_T arg1_number[] = {arg_number};
! argcheck_T arg1_dict[] = {arg_dict_any};
! argcheck_T arg1_list_nr[] = {arg_list_number};
! argcheck_T arg1_list_string[] = {arg_list_string};
! argcheck_T arg1_float_or_nr[] = {arg_float_or_nr};
! argcheck_T arg1_string_or_nr[] = {arg_string_or_nr};
! argcheck_T arg1_string_or_list_any[] = {arg_string_or_list_any};
! argcheck_T arg1_string_or_list_string[] = {arg_string_or_list_string};
! argcheck_T arg1_list_or_blob[] = {arg_list_or_blob};
! argcheck_T arg1_chan_or_job[] = {arg_chan_or_job};
! argcheck_T arg2_float_or_nr[] = {arg_float_or_nr, arg_float_or_nr};
! argcheck_T arg2_number[] = {arg_number, arg_number};
! argcheck_T arg2_string[] = {arg_string, arg_string};
! argcheck_T arg2_list_nr[] = {arg_list_number, arg_list_number};
! argcheck_T arg2_dict_string[] = {arg_dict_any, arg_string};
! argcheck_T arg2_dict_string_or_nr[] = {arg_dict_any, arg_string_or_nr};
! argcheck_T arg2_string_dict[] = {arg_string, arg_dict_any};
! argcheck_T arg2_listblob_item[] = {arg_list_or_blob, arg_item_of_prev};
! argcheck_T arg2_str_or_nr_or_list_dict[] = {arg_str_or_nr_or_list, 
arg_dict_any};
! argcheck_T arg2_string_or_list_dict[] = {arg_string_or_list_any, 
arg_dict_any};
! argcheck_T arg3_string[] = {arg_string, arg_string, arg_string};
! argcheck_T arg3_number[] = {arg_number, arg_number, arg_number};
! argcheck_T arg3_string_nr_bool[] = {arg_string, arg_number, arg_bool};
! argcheck_T arg3_string_string_nr[] = {arg_string, arg_string, arg_number};
! argcheck_T arg2_execute[] = {arg_string_or_list_string, arg_string};
! argcheck_T arg23_win_execute[] = {arg_number, arg_string_or_list_string, 
arg_string};
! argcheck_T arg2_setline[] = {arg_string_or_nr, arg_string_or_list_any};
! argcheck_T arg3_setbufline[] = {arg_string_or_nr, arg_string_or_nr, 
arg_string_or_list_any};
! argcheck_T arg23_extend[] = {arg_list_or_dict, arg_same_as_prev, arg_extend3};
! argcheck_T arg23_extendnew[] = {arg_list_or_dict, arg_same_struct_as_prev, 
arg_extend3};
! argcheck_T arg3_insert[] = {arg_list_or_blob, arg_item_of_prev, arg_number};
  
  /*
   * Functions that return the return type of a builtin function.
--- 475,521 ----
  /*
   * Lists of functions that check the argument types of a builtin function.
   */
! static argcheck_T arg1_string[] = {arg_string};
! static argcheck_T arg1_number[] = {arg_number};
! static argcheck_T arg1_bool[] = {arg_bool};
! static argcheck_T arg1_dict_any[] = {arg_dict_any};
! static argcheck_T arg1_job[] = {arg_job};
! static argcheck_T arg1_list_any[] = {arg_list_any};
! static argcheck_T arg1_list_nr[] = {arg_list_number};
! static argcheck_T arg1_list_string[] = {arg_list_string};
! static argcheck_T arg1_float_or_nr[] = {arg_float_or_nr};
! static argcheck_T arg1_string_or_nr[] = {arg_string_or_nr};
! static argcheck_T arg1_string_or_list_any[] = {arg_string_or_list_any};
! static argcheck_T arg1_string_or_list_string[] = {arg_string_or_list_string};
! static argcheck_T arg1_list_or_blob[] = {arg_list_or_blob};
! static argcheck_T arg1_list_or_dict[] = {arg_list_or_dict};
! static argcheck_T arg1_chan_or_job[] = {arg_chan_or_job};
! static argcheck_T arg2_float_or_nr[] = {arg_float_or_nr, arg_float_or_nr};
! static argcheck_T arg2_number[] = {arg_number, arg_number};
! static argcheck_T arg2_string[] = {arg_string, arg_string};
! static argcheck_T arg2_list_nr[] = {arg_list_number, arg_list_number};
! static argcheck_T arg2_nr_string[] = {arg_number, arg_string};
! static argcheck_T arg2_dict_string[] = {arg_dict_any, arg_string};
! static argcheck_T arg2_dict_string_or_nr[] = {arg_dict_any, arg_string_or_nr};
! static argcheck_T arg2_string_dict[] = {arg_string, arg_dict_any};
! static argcheck_T arg2_string_nr[] = {arg_string, arg_number};
! //static argcheck_T arg2_listblob_item[] = {arg_list_or_blob, 
arg_item_of_prev};
! static argcheck_T arg2_str_or_nr_or_list_dict[] = {arg_str_or_nr_or_list, 
arg_dict_any};
! static argcheck_T arg2_string_or_list_dict[] = {arg_string_or_list_any, 
arg_dict_any};
! static argcheck_T arg2_chan_or_job_dict[] = {arg_chan_or_job, arg_dict_any};
! static argcheck_T arg2_nr_dict_any[] = {arg_number, arg_dict_any};
! //static argcheck_T arg2_string_number[] = {arg_string, arg_number};
! static argcheck_T arg3_string[] = {arg_string, arg_string, arg_string};
! static argcheck_T arg3_number[] = {arg_number, arg_number, arg_number};
! static argcheck_T arg3_string_nr_bool[] = {arg_string, arg_number, arg_bool};
! static argcheck_T arg3_string_string_nr[] = {arg_string, arg_string, 
arg_number};
! static argcheck_T arg2_execute[] = {arg_string_or_list_string, arg_string};
! static argcheck_T arg23_win_execute[] = {arg_number, 
arg_string_or_list_string, arg_string};
! static argcheck_T arg2_setline[] = {arg_string_or_nr, NULL};
! static argcheck_T arg3_setbufline[] = {arg_string_or_nr, arg_string_or_nr, 
arg_str_or_nr_or_list};
! static argcheck_T arg23_extend[] = {arg_list_or_dict, arg_same_as_prev, 
arg_extend3};
! static argcheck_T arg23_extendnew[] = {arg_list_or_dict, 
arg_same_struct_as_prev, arg_extend3};
! static argcheck_T arg3_insert[] = {arg_list_or_blob, arg_item_of_prev, 
arg_number};
  
  /*
   * Functions that return the return type of a builtin function.
***************
*** 762,770 ****
                        ret_first_arg,      f_add},
      {"and",           2, 2, FEARG_1,      arg2_number,
                        ret_number,         f_and},
!     {"append",                2, 2, FEARG_2,      NULL,
                        ret_number_bool,    f_append},
!     {"appendbufline", 3, 3, FEARG_3,      NULL,
                        ret_number_bool,    f_appendbufline},
      {"argc",          0, 1, 0,            arg1_number,
                        ret_number,         f_argc},
--- 787,795 ----
                        ret_first_arg,      f_add},
      {"and",           2, 2, FEARG_1,      arg2_number,
                        ret_number,         f_and},
!     {"append",                2, 2, FEARG_2,      arg2_setline,
                        ret_number_bool,    f_append},
!     {"appendbufline", 3, 3, FEARG_3,      arg3_setbufline,
                        ret_number_bool,    f_appendbufline},
      {"argc",          0, 1, 0,            arg1_number,
                        ret_number,         f_argc},
***************
*** 776,782 ****
                        ret_argv,           f_argv},
      {"asin",          1, 1, FEARG_1,      arg1_float_or_nr,
                        ret_float,          FLOAT_FUNC(f_asin)},
!     {"assert_beeps",  1, 2, FEARG_1,      NULL,
                        ret_number_bool,    f_assert_beeps},
      {"assert_equal",  2, 3, FEARG_2,      NULL,
                        ret_number_bool,    f_assert_equal},
--- 801,807 ----
                        ret_argv,           f_argv},
      {"asin",          1, 1, FEARG_1,      arg1_float_or_nr,
                        ret_float,          FLOAT_FUNC(f_asin)},
!     {"assert_beeps",  1, 1, FEARG_1,      arg1_string,
                        ret_number_bool,    f_assert_beeps},
      {"assert_equal",  2, 3, FEARG_2,      NULL,
                        ret_number_bool,    f_assert_equal},
***************
*** 792,798 ****
                        ret_number_bool,    f_assert_inrange},
      {"assert_match",  2, 3, FEARG_2,      arg3_string,
                        ret_number_bool,    f_assert_match},
!     {"assert_nobeep", 1, 2, FEARG_1,      NULL,
                        ret_number_bool,    f_assert_nobeep},
      {"assert_notequal",       2, 3, FEARG_2,      NULL,
                        ret_number_bool,    f_assert_notequal},
--- 817,823 ----
                        ret_number_bool,    f_assert_inrange},
      {"assert_match",  2, 3, FEARG_2,      arg3_string,
                        ret_number_bool,    f_assert_match},
!     {"assert_nobeep", 1, 1, FEARG_1,      arg1_string,
                        ret_number_bool,    f_assert_nobeep},
      {"assert_notequal",       2, 3, FEARG_2,      NULL,
                        ret_number_bool,    f_assert_notequal},
***************
*** 860,868 ****
                        ret_number,         f_bufwinnr},
      {"byte2line",     1, 1, FEARG_1,      arg1_number,
                        ret_number,         f_byte2line},
!     {"byteidx",               2, 2, FEARG_1,      NULL,
                        ret_number,         f_byteidx},
!     {"byteidxcomp",   2, 2, FEARG_1,      NULL,
                        ret_number,         f_byteidxcomp},
      {"call",          2, 3, FEARG_1,      NULL,
                        ret_any,            f_call},
--- 885,893 ----
                        ret_number,         f_bufwinnr},
      {"byte2line",     1, 1, FEARG_1,      arg1_number,
                        ret_number,         f_byte2line},
!     {"byteidx",               2, 2, FEARG_1,      arg2_string_nr,
                        ret_number,         f_byteidx},
!     {"byteidxcomp",   2, 2, FEARG_1,      arg2_string_nr,
                        ret_number,         f_byteidxcomp},
      {"call",          2, 3, FEARG_1,      NULL,
                        ret_any,            f_call},
***************
*** 880,886 ****
                        ret_any,            JOB_FUNC(f_ch_evalraw)},
      {"ch_getbufnr",   2, 2, FEARG_1,      NULL,
                        ret_number,         JOB_FUNC(f_ch_getbufnr)},
!     {"ch_getjob",     1, 1, FEARG_1,      NULL,
                        ret_job,            JOB_FUNC(f_ch_getjob)},
      {"ch_info",               1, 1, FEARG_1,      arg1_chan_or_job,
                        ret_dict_any,       JOB_FUNC(f_ch_info)},
--- 905,911 ----
                        ret_any,            JOB_FUNC(f_ch_evalraw)},
      {"ch_getbufnr",   2, 2, FEARG_1,      NULL,
                        ret_number,         JOB_FUNC(f_ch_getbufnr)},
!     {"ch_getjob",     1, 1, FEARG_1,      arg1_chan_or_job,
                        ret_job,            JOB_FUNC(f_ch_getjob)},
      {"ch_info",               1, 1, FEARG_1,      arg1_chan_or_job,
                        ret_dict_any,       JOB_FUNC(f_ch_info)},
***************
*** 890,908 ****
                        ret_void,           JOB_FUNC(f_ch_logfile)},
      {"ch_open",               1, 2, FEARG_1,      arg2_string_dict,
                        ret_channel,        JOB_FUNC(f_ch_open)},
!     {"ch_read",               1, 2, FEARG_1,      NULL,
                        ret_string,         JOB_FUNC(f_ch_read)},
!     {"ch_readblob",   1, 2, FEARG_1,      NULL,
                        ret_blob,           JOB_FUNC(f_ch_readblob)},
!     {"ch_readraw",    1, 2, FEARG_1,      NULL,
                        ret_string,         JOB_FUNC(f_ch_readraw)},
      {"ch_sendexpr",   2, 3, FEARG_1,      NULL,
                        ret_void,           JOB_FUNC(f_ch_sendexpr)},
      {"ch_sendraw",    2, 3, FEARG_1,      NULL,
                        ret_void,           JOB_FUNC(f_ch_sendraw)},
!     {"ch_setoptions", 2, 2, FEARG_1,      NULL,
                        ret_void,           JOB_FUNC(f_ch_setoptions)},
!     {"ch_status",     1, 2, FEARG_1,      NULL,
                        ret_string,         JOB_FUNC(f_ch_status)},
      {"changenr",      0, 0, 0,            NULL,
                        ret_number,         f_changenr},
--- 915,933 ----
                        ret_void,           JOB_FUNC(f_ch_logfile)},
      {"ch_open",               1, 2, FEARG_1,      arg2_string_dict,
                        ret_channel,        JOB_FUNC(f_ch_open)},
!     {"ch_read",               1, 2, FEARG_1,      arg2_chan_or_job_dict,
                        ret_string,         JOB_FUNC(f_ch_read)},
!     {"ch_readblob",   1, 2, FEARG_1,      arg2_chan_or_job_dict,
                        ret_blob,           JOB_FUNC(f_ch_readblob)},
!     {"ch_readraw",    1, 2, FEARG_1,      arg2_chan_or_job_dict,
                        ret_string,         JOB_FUNC(f_ch_readraw)},
      {"ch_sendexpr",   2, 3, FEARG_1,      NULL,
                        ret_void,           JOB_FUNC(f_ch_sendexpr)},
      {"ch_sendraw",    2, 3, FEARG_1,      NULL,
                        ret_void,           JOB_FUNC(f_ch_sendraw)},
!     {"ch_setoptions", 2, 2, FEARG_1,      arg2_chan_or_job_dict,
                        ret_void,           JOB_FUNC(f_ch_setoptions)},
!     {"ch_status",     1, 2, FEARG_1,      arg2_chan_or_job_dict,
                        ret_string,         JOB_FUNC(f_ch_status)},
      {"changenr",      0, 0, 0,            NULL,
                        ret_number,         f_changenr},
***************
*** 964,970 ****
                        ret_number,         f_diff_filler},
      {"diff_hlID",     2, 2, FEARG_1,      NULL,
                        ret_number,         f_diff_hlID},
!     {"echoraw",               1, 1, FEARG_1,      NULL,
                        ret_void,           f_echoraw},
      {"empty",         1, 1, FEARG_1,      NULL,
                        ret_number_bool,    f_empty},
--- 989,995 ----
                        ret_number,         f_diff_filler},
      {"diff_hlID",     2, 2, FEARG_1,      NULL,
                        ret_number,         f_diff_hlID},
!     {"echoraw",               1, 1, FEARG_1,      arg1_string,
                        ret_void,           f_echoraw},
      {"empty",         1, 1, FEARG_1,      NULL,
                        ret_number_bool,    f_empty},
***************
*** 1040,1046 ****
                        ret_func_any,       f_funcref},
      {"function",      1, 3, FEARG_1,      NULL,
                        ret_f_function,     f_function},
!     {"garbagecollect",        0, 1, 0,            NULL,
                        ret_void,           f_garbagecollect},
      {"get",           2, 3, FEARG_1,      NULL,
                        ret_any,            f_get},
--- 1065,1071 ----
                        ret_func_any,       f_funcref},
      {"function",      1, 3, FEARG_1,      NULL,
                        ret_f_function,     f_function},
!     {"garbagecollect",        0, 1, 0,            arg1_bool,
                        ret_void,           f_garbagecollect},
      {"get",           2, 3, FEARG_1,      NULL,
                        ret_any,            f_get},
***************
*** 1052,1066 ****
                        ret_any,            f_getbufvar},
      {"getchangelist", 0, 1, FEARG_1,      arg1_string_or_nr,
                        ret_list_any,       f_getchangelist},
!     {"getchar",               0, 1, 0,            NULL,
                        ret_any,            f_getchar},
      {"getcharmod",    0, 0, 0,            NULL,
                        ret_number,         f_getcharmod},
!     {"getcharpos",    1, 1, FEARG_1,      NULL,
                        ret_list_number,    f_getcharpos},
      {"getcharsearch", 0, 0, 0,            NULL,
                        ret_dict_any,       f_getcharsearch},
!     {"getcharstr",    0, 1, 0,            NULL,
                        ret_string,         f_getcharstr},
      {"getcmdline",    0, 0, 0,            NULL,
                        ret_string,         f_getcmdline},
--- 1077,1091 ----
                        ret_any,            f_getbufvar},
      {"getchangelist", 0, 1, FEARG_1,      arg1_string_or_nr,
                        ret_list_any,       f_getchangelist},
!     {"getchar",               0, 1, 0,            arg1_bool,
                        ret_any,            f_getchar},
      {"getcharmod",    0, 0, 0,            NULL,
                        ret_number,         f_getcharmod},
!     {"getcharpos",    1, 1, FEARG_1,      arg1_string,
                        ret_list_number,    f_getcharpos},
      {"getcharsearch", 0, 0, 0,            NULL,
                        ret_dict_any,       f_getcharsearch},
!     {"getcharstr",    0, 1, 0,            arg1_bool,
                        ret_string,         f_getcharstr},
      {"getcmdline",    0, 0, 0,            NULL,
                        ret_string,         f_getcmdline},
***************
*** 1096,1102 ****
                        ret_list_any,       f_getjumplist},
      {"getline",               1, 2, FEARG_1,      NULL,
                        ret_f_getline,      f_getline},
!     {"getloclist",    1, 2, 0,            NULL,
                        ret_list_or_dict_1, f_getloclist},
      {"getmarklist",   0, 1, FEARG_1,      arg1_string_or_nr,
                        ret_list_dict_any,  f_getmarklist},
--- 1121,1127 ----
                        ret_list_any,       f_getjumplist},
      {"getline",               1, 2, FEARG_1,      NULL,
                        ret_f_getline,      f_getline},
!     {"getloclist",    1, 2, 0,            arg2_nr_dict_any,
                        ret_list_or_dict_1, f_getloclist},
      {"getmarklist",   0, 1, FEARG_1,      arg1_string_or_nr,
                        ret_list_dict_any,  f_getmarklist},
***************
*** 1108,1114 ****
                        ret_number,         f_getpid},
      {"getpos",                1, 1, FEARG_1,      arg1_string,
                        ret_list_number,    f_getpos},
!     {"getqflist",     0, 1, 0,            arg1_dict,
                        ret_list_or_dict_0, f_getqflist},
      {"getreg",                0, 3, FEARG_1,      NULL,
                        ret_getreg,         f_getreg},
--- 1133,1139 ----
                        ret_number,         f_getpid},
      {"getpos",                1, 1, FEARG_1,      arg1_string,
                        ret_list_number,    f_getpos},
!     {"getqflist",     0, 1, 0,            arg1_dict_any,
                        ret_list_or_dict_0, f_getqflist},
      {"getreg",                0, 3, FEARG_1,      NULL,
                        ret_getreg,         f_getreg},
***************
*** 1158,1164 ****
                        ret_number_bool,    f_histadd},
      {"histdel",               1, 2, FEARG_1,      NULL,
                        ret_number_bool,    f_histdel},
!     {"histget",               1, 2, FEARG_1,      NULL,
                        ret_string,         f_histget},
      {"histnr",                1, 1, FEARG_1,      arg1_string,
                        ret_number,         f_histnr},
--- 1183,1189 ----
                        ret_number_bool,    f_histadd},
      {"histdel",               1, 2, FEARG_1,      NULL,
                        ret_number_bool,    f_histdel},
!     {"histget",               1, 2, FEARG_1,      arg2_string_nr,
                        ret_string,         f_histget},
      {"histnr",                1, 1, FEARG_1,      arg1_string,
                        ret_number,         f_histnr},
***************
*** 1196,1216 ****
                        ret_number_bool,    f_isdirectory},
      {"isinf",         1, 1, FEARG_1,      arg1_float_or_nr,
                        ret_number,         MATH_FUNC(f_isinf)},
!     {"islocked",      1, 1, FEARG_1,      NULL,
                        ret_number_bool,    f_islocked},
      {"isnan",         1, 1, FEARG_1,      arg1_float_or_nr,
                        ret_number_bool,    MATH_FUNC(f_isnan)},
!     {"items",         1, 1, FEARG_1,      arg1_dict,
                        ret_list_items,     f_items},
!     {"job_getchannel",        1, 1, FEARG_1,      NULL,
                        ret_channel,        JOB_FUNC(f_job_getchannel)},
!     {"job_info",      0, 1, FEARG_1,      NULL,
                        ret_job_info,       JOB_FUNC(f_job_info)},
      {"job_setoptions",        2, 2, FEARG_1,      NULL,
                        ret_void,           JOB_FUNC(f_job_setoptions)},
      {"job_start",     1, 2, FEARG_1,      NULL,
                        ret_job,            JOB_FUNC(f_job_start)},
!     {"job_status",    1, 1, FEARG_1,      NULL,
                        ret_string,         JOB_FUNC(f_job_status)},
      {"job_stop",      1, 2, FEARG_1,      NULL,
                        ret_number_bool,    JOB_FUNC(f_job_stop)},
--- 1221,1241 ----
                        ret_number_bool,    f_isdirectory},
      {"isinf",         1, 1, FEARG_1,      arg1_float_or_nr,
                        ret_number,         MATH_FUNC(f_isinf)},
!     {"islocked",      1, 1, FEARG_1,      arg1_string,
                        ret_number_bool,    f_islocked},
      {"isnan",         1, 1, FEARG_1,      arg1_float_or_nr,
                        ret_number_bool,    MATH_FUNC(f_isnan)},
!     {"items",         1, 1, FEARG_1,      arg1_dict_any,
                        ret_list_items,     f_items},
!     {"job_getchannel",        1, 1, FEARG_1,      arg1_job,
                        ret_channel,        JOB_FUNC(f_job_getchannel)},
!     {"job_info",      0, 1, FEARG_1,      arg1_job,
                        ret_job_info,       JOB_FUNC(f_job_info)},
      {"job_setoptions",        2, 2, FEARG_1,      NULL,
                        ret_void,           JOB_FUNC(f_job_setoptions)},
      {"job_start",     1, 2, FEARG_1,      NULL,
                        ret_job,            JOB_FUNC(f_job_start)},
!     {"job_status",    1, 1, FEARG_1,      arg1_job,
                        ret_string,         JOB_FUNC(f_job_status)},
      {"job_stop",      1, 2, FEARG_1,      NULL,
                        ret_number_bool,    JOB_FUNC(f_job_stop)},
***************
*** 1224,1230 ****
                        ret_any,            f_json_decode},
      {"json_encode",   1, 1, FEARG_1,      NULL,
                        ret_string,         f_json_encode},
!     {"keys",          1, 1, FEARG_1,      arg1_dict,
                        ret_list_string,    f_keys},
      {"last_buffer_nr",        0, 0, 0,            arg1_string_or_nr,  // 
obsolete
                        ret_number,         f_last_buffer_nr},
--- 1249,1255 ----
                        ret_any,            f_json_decode},
      {"json_encode",   1, 1, FEARG_1,      NULL,
                        ret_string,         f_json_encode},
!     {"keys",          1, 1, FEARG_1,      arg1_dict_any,
                        ret_list_string,    f_keys},
      {"last_buffer_nr",        0, 0, 0,            arg1_string_or_nr,  // 
obsolete
                        ret_number,         f_last_buffer_nr},
***************
*** 1234,1240 ****
                        ret_string,         f_libcall},
      {"libcallnr",     3, 3, FEARG_3,      NULL,
                        ret_number,         f_libcallnr},
!     {"line",          1, 2, FEARG_1,      NULL,
                        ret_number,         f_line},
      {"line2byte",     1, 1, FEARG_1,      arg1_string_or_nr,
                        ret_number,         f_line2byte},
--- 1259,1265 ----
                        ret_string,         f_libcall},
      {"libcallnr",     3, 3, FEARG_3,      NULL,
                        ret_number,         f_libcallnr},
!     {"line",          1, 2, FEARG_1,      arg2_string_nr,
                        ret_number,         f_line},
      {"line2byte",     1, 1, FEARG_1,      arg1_string_or_nr,
                        ret_number,         f_line2byte},
***************
*** 1294,1300 ****
                        ret_string,         f_matchstr},
      {"matchstrpos",   2, 4, FEARG_1,      NULL,
                        ret_list_any,       f_matchstrpos},
!     {"max",           1, 1, FEARG_1,      NULL,
                        ret_number,         f_max},
      {"menu_info",     1, 2, FEARG_1,      arg2_string,
                        ret_dict_any,
--- 1319,1325 ----
                        ret_string,         f_matchstr},
      {"matchstrpos",   2, 4, FEARG_1,      NULL,
                        ret_list_any,       f_matchstrpos},
!     {"max",           1, 1, FEARG_1,      arg1_list_or_dict,
                        ret_number,         f_max},
      {"menu_info",     1, 2, FEARG_1,      arg2_string,
                        ret_dict_any,
***************
*** 1304,1316 ****
            NULL
  #endif
                        },
!     {"min",           1, 1, FEARG_1,      NULL,
                        ret_number,         f_min},
      {"mkdir",         1, 3, FEARG_1,      arg3_string_string_nr,
                        ret_number_bool,    f_mkdir},
!     {"mode",          0, 1, FEARG_1,      NULL,
                        ret_string,         f_mode},
!     {"mzeval",                1, 1, FEARG_1,      NULL,
                        ret_any,
  #ifdef FEAT_MZSCHEME
            f_mzeval
--- 1329,1341 ----
            NULL
  #endif
                        },
!     {"min",           1, 1, FEARG_1,      arg1_list_or_dict,
                        ret_number,         f_min},
      {"mkdir",         1, 3, FEARG_1,      arg3_string_string_nr,
                        ret_number_bool,    f_mkdir},
!     {"mode",          0, 1, FEARG_1,      arg1_bool,
                        ret_string,         f_mode},
!     {"mzeval",                1, 1, FEARG_1,      arg1_string,
                        ret_any,
  #ifdef FEAT_MZSCHEME
            f_mzeval
***************
*** 1324,1332 ****
                        ret_string,         f_nr2char},
      {"or",            2, 2, FEARG_1,      arg2_number,
                        ret_number,         f_or},
!     {"pathshorten",   1, 2, FEARG_1,      NULL,
                        ret_string,         f_pathshorten},
!     {"perleval",      1, 1, FEARG_1,      NULL,
                        ret_any,
  #ifdef FEAT_PERL
            f_perleval
--- 1349,1357 ----
                        ret_string,         f_nr2char},
      {"or",            2, 2, FEARG_1,      arg2_number,
                        ret_number,         f_or},
!     {"pathshorten",   1, 2, FEARG_1,      arg2_string_nr,
                        ret_string,         f_pathshorten},
!     {"perleval",      1, 1, FEARG_1,      arg1_string,
                        ret_any,
  #ifdef FEAT_PERL
            f_perleval
***************
*** 1338,1344 ****
                        ret_number,         PROP_FUNC(f_popup_atcursor)},
      {"popup_beval",   2, 2, FEARG_1,      arg2_str_or_nr_or_list_dict,
                        ret_number,         PROP_FUNC(f_popup_beval)},
!     {"popup_clear",   0, 1, 0,            NULL,
                        ret_void,           PROP_FUNC(f_popup_clear)},
      {"popup_close",   1, 2, FEARG_1,      NULL,
                        ret_void,           PROP_FUNC(f_popup_close)},
--- 1363,1369 ----
                        ret_number,         PROP_FUNC(f_popup_atcursor)},
      {"popup_beval",   2, 2, FEARG_1,      arg2_str_or_nr_or_list_dict,
                        ret_number,         PROP_FUNC(f_popup_beval)},
!     {"popup_clear",   0, 1, 0,            arg1_bool,
                        ret_void,           PROP_FUNC(f_popup_clear)},
      {"popup_close",   1, 2, FEARG_1,      NULL,
                        ret_void,           PROP_FUNC(f_popup_close)},
***************
*** 1346,1364 ****
                        ret_number,         PROP_FUNC(f_popup_create)},
      {"popup_dialog",  2, 2, FEARG_1,      arg2_str_or_nr_or_list_dict,
                        ret_number,         PROP_FUNC(f_popup_dialog)},
!     {"popup_filter_menu", 2, 2, 0,        NULL,
                        ret_bool,           PROP_FUNC(f_popup_filter_menu)},
!     {"popup_filter_yesno", 2, 2, 0,       NULL,
                        ret_bool,           PROP_FUNC(f_popup_filter_yesno)},
      {"popup_findinfo",        0, 0, 0,            NULL,
                        ret_number,         PROP_FUNC(f_popup_findinfo)},
      {"popup_findpreview", 0, 0, 0,        NULL,
                        ret_number,         PROP_FUNC(f_popup_findpreview)},
!     {"popup_getoptions", 1, 1, FEARG_1,           NULL,
                        ret_dict_any,       PROP_FUNC(f_popup_getoptions)},
!     {"popup_getpos",  1, 1, FEARG_1,      NULL,
                        ret_dict_any,       PROP_FUNC(f_popup_getpos)},
!     {"popup_hide",    1, 1, FEARG_1,      NULL,
                        ret_void,           PROP_FUNC(f_popup_hide)},
      {"popup_list",    0, 0, 0,            NULL,
                        ret_list_number,    PROP_FUNC(f_popup_list)},
--- 1371,1389 ----
                        ret_number,         PROP_FUNC(f_popup_create)},
      {"popup_dialog",  2, 2, FEARG_1,      arg2_str_or_nr_or_list_dict,
                        ret_number,         PROP_FUNC(f_popup_dialog)},
!     {"popup_filter_menu", 2, 2, 0,        arg2_nr_string,
                        ret_bool,           PROP_FUNC(f_popup_filter_menu)},
!     {"popup_filter_yesno", 2, 2, 0,       arg2_nr_string,
                        ret_bool,           PROP_FUNC(f_popup_filter_yesno)},
      {"popup_findinfo",        0, 0, 0,            NULL,
                        ret_number,         PROP_FUNC(f_popup_findinfo)},
      {"popup_findpreview", 0, 0, 0,        NULL,
                        ret_number,         PROP_FUNC(f_popup_findpreview)},
!     {"popup_getoptions", 1, 1, FEARG_1,           arg1_number,
                        ret_dict_any,       PROP_FUNC(f_popup_getoptions)},
!     {"popup_getpos",  1, 1, FEARG_1,      arg1_number,
                        ret_dict_any,       PROP_FUNC(f_popup_getpos)},
!     {"popup_hide",    1, 1, FEARG_1,      arg1_number,
                        ret_void,           PROP_FUNC(f_popup_hide)},
      {"popup_list",    0, 0, 0,            NULL,
                        ret_list_number,    PROP_FUNC(f_popup_list)},
***************
*** 1366,1380 ****
                        ret_number,         PROP_FUNC(f_popup_locate)},
      {"popup_menu",    2, 2, FEARG_1,      arg2_str_or_nr_or_list_dict,
                        ret_number,         PROP_FUNC(f_popup_menu)},
!     {"popup_move",    2, 2, FEARG_1,      NULL,
                        ret_void,           PROP_FUNC(f_popup_move)},
      {"popup_notification", 2, 2, FEARG_1,   arg2_str_or_nr_or_list_dict,
                        ret_number,         PROP_FUNC(f_popup_notification)},
!     {"popup_setoptions", 2, 2, FEARG_1,           NULL,
                        ret_void,           PROP_FUNC(f_popup_setoptions)},
      {"popup_settext", 2, 2, FEARG_1,      NULL,
                        ret_void,           PROP_FUNC(f_popup_settext)},
!     {"popup_show",    1, 1, FEARG_1,      NULL,
                        ret_void,           PROP_FUNC(f_popup_show)},
      {"pow",           2, 2, FEARG_1,      arg2_float_or_nr,
                        ret_float,          FLOAT_FUNC(f_pow)},
--- 1391,1405 ----
                        ret_number,         PROP_FUNC(f_popup_locate)},
      {"popup_menu",    2, 2, FEARG_1,      arg2_str_or_nr_or_list_dict,
                        ret_number,         PROP_FUNC(f_popup_menu)},
!     {"popup_move",    2, 2, FEARG_1,      arg2_nr_dict_any,
                        ret_void,           PROP_FUNC(f_popup_move)},
      {"popup_notification", 2, 2, FEARG_1,   arg2_str_or_nr_or_list_dict,
                        ret_number,         PROP_FUNC(f_popup_notification)},
!     {"popup_setoptions", 2, 2, FEARG_1,           arg2_nr_dict_any,
                        ret_void,           PROP_FUNC(f_popup_setoptions)},
      {"popup_settext", 2, 2, FEARG_1,      NULL,
                        ret_void,           PROP_FUNC(f_popup_settext)},
!     {"popup_show",    1, 1, FEARG_1,      arg1_number,
                        ret_void,           PROP_FUNC(f_popup_show)},
      {"pow",           2, 2, FEARG_1,      arg2_float_or_nr,
                        ret_float,          FLOAT_FUNC(f_pow)},
***************
*** 1396,1402 ****
                        ret_void,           PROP_FUNC(f_prop_clear)},
      {"prop_find",     1, 2, FEARG_1,      arg2_dict_string,
                        ret_dict_any,       PROP_FUNC(f_prop_find)},
!     {"prop_list",     1, 2, FEARG_1,      NULL,
                        ret_list_dict_any,  PROP_FUNC(f_prop_list)},
      {"prop_remove",   1, 3, FEARG_1,      NULL,
                        ret_number,         PROP_FUNC(f_prop_remove)},
--- 1421,1427 ----
                        ret_void,           PROP_FUNC(f_prop_clear)},
      {"prop_find",     1, 2, FEARG_1,      arg2_dict_string,
                        ret_dict_any,       PROP_FUNC(f_prop_find)},
!     {"prop_list",     1, 2, FEARG_1,      arg2_nr_dict_any,
                        ret_list_dict_any,  PROP_FUNC(f_prop_list)},
      {"prop_remove",   1, 3, FEARG_1,      NULL,
                        ret_number,         PROP_FUNC(f_prop_remove)},
***************
*** 1408,1420 ****
                        ret_void,           PROP_FUNC(f_prop_type_delete)},
      {"prop_type_get", 1, 2, FEARG_1,      arg2_string_dict,
                        ret_dict_any,       PROP_FUNC(f_prop_type_get)},
!     {"prop_type_list",        0, 1, FEARG_1,      NULL,
                        ret_list_string,    PROP_FUNC(f_prop_type_list)},
      {"pum_getpos",    0, 0, 0,            NULL,
                        ret_dict_number,    f_pum_getpos},
      {"pumvisible",    0, 0, 0,            NULL,
                        ret_number_bool,    f_pumvisible},
!     {"py3eval",               1, 1, FEARG_1,      NULL,
                        ret_any,
  #ifdef FEAT_PYTHON3
            f_py3eval
--- 1433,1445 ----
                        ret_void,           PROP_FUNC(f_prop_type_delete)},
      {"prop_type_get", 1, 2, FEARG_1,      arg2_string_dict,
                        ret_dict_any,       PROP_FUNC(f_prop_type_get)},
!     {"prop_type_list",        0, 1, FEARG_1,      arg1_dict_any,
                        ret_list_string,    PROP_FUNC(f_prop_type_list)},
      {"pum_getpos",    0, 0, 0,            NULL,
                        ret_dict_number,    f_pum_getpos},
      {"pumvisible",    0, 0, 0,            NULL,
                        ret_number_bool,    f_pumvisible},
!     {"py3eval",               1, 1, FEARG_1,      arg1_string,
                        ret_any,
  #ifdef FEAT_PYTHON3
            f_py3eval
***************
*** 1422,1428 ****
            NULL
  #endif
            },
!     {"pyeval",                1, 1, FEARG_1,      NULL,
                        ret_any,
  #ifdef FEAT_PYTHON
            f_pyeval
--- 1447,1453 ----
            NULL
  #endif
            },
!     {"pyeval",                1, 1, FEARG_1,      arg1_string,
                        ret_any,
  #ifdef FEAT_PYTHON
            f_pyeval
***************
*** 1430,1436 ****
            NULL
  #endif
                        },
!     {"pyxeval",               1, 1, FEARG_1,      NULL,
                        ret_any,
  #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
            f_pyxeval
--- 1455,1461 ----
            NULL
  #endif
                        },
!     {"pyxeval",               1, 1, FEARG_1,      arg1_string,
                        ret_any,
  #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
            f_pyxeval
***************
*** 1468,1474 ****
                        ret_string,         f_remote_foreground},
      {"remote_peek",   1, 2, FEARG_1,      arg2_string,
                        ret_number,         f_remote_peek},
!     {"remote_read",   1, 2, FEARG_1,      NULL,
                        ret_string,         f_remote_read},
      {"remote_send",   2, 3, FEARG_1,      NULL,
                        ret_string,         f_remote_send},
--- 1493,1499 ----
                        ret_string,         f_remote_foreground},
      {"remote_peek",   1, 2, FEARG_1,      arg2_string,
                        ret_number,         f_remote_peek},
!     {"remote_read",   1, 2, FEARG_1,      arg2_string_nr,
                        ret_string,         f_remote_read},
      {"remote_send",   2, 3, FEARG_1,      NULL,
                        ret_string,         f_remote_send},
***************
*** 1486,1492 ****
                        ret_first_arg,      f_reverse},
      {"round",         1, 1, FEARG_1,      arg1_float_or_nr,
                        ret_float,          FLOAT_FUNC(f_round)},
!     {"rubyeval",      1, 1, FEARG_1,      NULL,
                        ret_any,
  #ifdef FEAT_RUBY
            f_rubyeval
--- 1511,1517 ----
                        ret_first_arg,      f_reverse},
      {"round",         1, 1, FEARG_1,      arg1_float_or_nr,
                        ret_float,          FLOAT_FUNC(f_round)},
!     {"rubyeval",      1, 1, FEARG_1,      arg1_string,
                        ret_any,
  #ifdef FEAT_RUBY
            f_rubyeval
***************
*** 1510,1516 ****
                        ret_string,         f_screenstring},
      {"search",                1, 5, FEARG_1,      NULL,
                        ret_number,         f_search},
!     {"searchcount",   0, 1, FEARG_1,      arg1_dict,
                        ret_dict_any,       f_searchcount},
      {"searchdecl",    1, 3, FEARG_1,      NULL,
                        ret_number_bool,    f_searchdecl},
--- 1535,1541 ----
                        ret_string,         f_screenstring},
      {"search",                1, 5, FEARG_1,      NULL,
                        ret_number,         f_search},
!     {"searchcount",   0, 1, FEARG_1,      arg1_dict_any,
                        ret_dict_any,       f_searchcount},
      {"searchdecl",    1, 3, FEARG_1,      NULL,
                        ret_number_bool,    f_searchdecl},
***************
*** 1524,1538 ****
                        ret_number_bool,    f_server2client},
      {"serverlist",    0, 0, 0,            NULL,
                        ret_string,         f_serverlist},
!     {"setbufline",    3, 3, FEARG_3,      NULL,
                        ret_number_bool,    f_setbufline},
      {"setbufvar",     3, 3, FEARG_3,      NULL,
                        ret_void,           f_setbufvar},
!     {"setcellwidths", 1, 1, FEARG_1,      NULL,
                        ret_void,           f_setcellwidths},
      {"setcharpos",    2, 2, FEARG_2,      NULL,
                        ret_number_bool,    f_setcharpos},
!     {"setcharsearch", 1, 1, FEARG_1,      arg1_dict,
                        ret_void,           f_setcharsearch},
      {"setcmdpos",     1, 1, FEARG_1,      arg1_number,
                        ret_number_bool,    f_setcmdpos},
--- 1549,1563 ----
                        ret_number_bool,    f_server2client},
      {"serverlist",    0, 0, 0,            NULL,
                        ret_string,         f_serverlist},
!     {"setbufline",    3, 3, FEARG_3,      arg3_setbufline,
                        ret_number_bool,    f_setbufline},
      {"setbufvar",     3, 3, FEARG_3,      NULL,
                        ret_void,           f_setbufvar},
!     {"setcellwidths", 1, 1, FEARG_1,      arg1_list_any,
                        ret_void,           f_setcellwidths},
      {"setcharpos",    2, 2, FEARG_2,      NULL,
                        ret_number_bool,    f_setcharpos},
!     {"setcharsearch", 1, 1, FEARG_1,      arg1_dict_any,
                        ret_void,           f_setcharsearch},
      {"setcmdpos",     1, 1, FEARG_1,      arg1_number,
                        ret_number_bool,    f_setcmdpos},
***************
*** 1542,1548 ****
                        ret_void,           f_setenv},
      {"setfperm",      2, 2, FEARG_1,      arg2_string,
                        ret_number_bool,    f_setfperm},
!     {"setline",               2, 2, FEARG_2,      NULL,
                        ret_number_bool,    f_setline},
      {"setloclist",    2, 4, FEARG_2,      NULL,
                        ret_number_bool,    f_setloclist},
--- 1567,1573 ----
                        ret_void,           f_setenv},
      {"setfperm",      2, 2, FEARG_1,      arg2_string,
                        ret_number_bool,    f_setfperm},
!     {"setline",               2, 2, FEARG_2,      arg2_setline,
                        ret_number_bool,    f_setline},
      {"setloclist",    2, 4, FEARG_2,      NULL,
                        ret_number_bool,    f_setloclist},
***************
*** 1576,1582 ****
                        ret_number,         f_shiftwidth},
      {"sign_define",   1, 2, FEARG_1,      arg2_string_or_list_dict,
                        ret_any,            SIGN_FUNC(f_sign_define)},
!     {"sign_getdefined",       0, 1, FEARG_1,      NULL,
                        ret_list_dict_any,  SIGN_FUNC(f_sign_getdefined)},
      {"sign_getplaced",        0, 2, FEARG_1,      NULL,
                        ret_list_dict_any,  SIGN_FUNC(f_sign_getplaced)},
--- 1601,1607 ----
                        ret_number,         f_shiftwidth},
      {"sign_define",   1, 2, FEARG_1,      arg2_string_or_list_dict,
                        ret_any,            SIGN_FUNC(f_sign_define)},
!     {"sign_getdefined",       0, 1, FEARG_1,      arg1_string,
                        ret_list_dict_any,  SIGN_FUNC(f_sign_getdefined)},
      {"sign_getplaced",        0, 2, FEARG_1,      NULL,
                        ret_list_dict_any,  SIGN_FUNC(f_sign_getplaced)},
***************
*** 1584,1596 ****
                        ret_number,         SIGN_FUNC(f_sign_jump)},
      {"sign_place",    4, 5, FEARG_1,      NULL,
                        ret_number,         SIGN_FUNC(f_sign_place)},
!     {"sign_placelist",        1, 1, FEARG_1,      NULL,
                        ret_list_number,    SIGN_FUNC(f_sign_placelist)},
      {"sign_undefine", 0, 1, FEARG_1,      arg1_string_or_list_string,
                        ret_number_bool,    SIGN_FUNC(f_sign_undefine)},
      {"sign_unplace",  1, 2, FEARG_1,      arg2_string_dict,
                        ret_number_bool,    SIGN_FUNC(f_sign_unplace)},
!     {"sign_unplacelist", 1, 2, FEARG_1,           NULL,
                        ret_list_number,    SIGN_FUNC(f_sign_unplacelist)},
      {"simplify",      1, 1, FEARG_1,      arg1_string,
                        ret_string,         f_simplify},
--- 1609,1621 ----
                        ret_number,         SIGN_FUNC(f_sign_jump)},
      {"sign_place",    4, 5, FEARG_1,      NULL,
                        ret_number,         SIGN_FUNC(f_sign_place)},
!     {"sign_placelist",        1, 1, FEARG_1,      arg1_list_any,
                        ret_list_number,    SIGN_FUNC(f_sign_placelist)},
      {"sign_undefine", 0, 1, FEARG_1,      arg1_string_or_list_string,
                        ret_number_bool,    SIGN_FUNC(f_sign_undefine)},
      {"sign_unplace",  1, 2, FEARG_1,      arg2_string_dict,
                        ret_number_bool,    SIGN_FUNC(f_sign_unplace)},
!     {"sign_unplacelist", 1, 2, FEARG_1,           arg1_list_any,
                        ret_list_number,    SIGN_FUNC(f_sign_unplacelist)},
      {"simplify",      1, 1, FEARG_1,      arg1_string,
                        ret_string,         f_simplify},
***************
*** 1630,1644 ****
                        ret_list_number,    f_str2list},
      {"str2nr",                1, 3, FEARG_1,      arg3_string_nr_bool,
                        ret_number,         f_str2nr},
!     {"strcharlen",    1, 1, FEARG_1,      NULL,
                        ret_number,         f_strcharlen},
      {"strcharpart",   2, 4, FEARG_1,      NULL,
                        ret_string,         f_strcharpart},
      {"strchars",      1, 2, FEARG_1,      NULL,
                        ret_number,         f_strchars},
!     {"strdisplaywidth",       1, 2, FEARG_1,      NULL,
                        ret_number,         f_strdisplaywidth},
!     {"strftime",      1, 2, FEARG_1,      NULL,
                        ret_string,
  #ifdef HAVE_STRFTIME
            f_strftime
--- 1655,1669 ----
                        ret_list_number,    f_str2list},
      {"str2nr",                1, 3, FEARG_1,      arg3_string_nr_bool,
                        ret_number,         f_str2nr},
!     {"strcharlen",    1, 1, FEARG_1,      arg1_string_or_nr,
                        ret_number,         f_strcharlen},
      {"strcharpart",   2, 4, FEARG_1,      NULL,
                        ret_string,         f_strcharpart},
      {"strchars",      1, 2, FEARG_1,      NULL,
                        ret_number,         f_strchars},
!     {"strdisplaywidth",       1, 2, FEARG_1,      arg2_string_nr,
                        ret_number,         f_strdisplaywidth},
!     {"strftime",      1, 2, FEARG_1,      arg2_string_nr,
                        ret_string,
  #ifdef HAVE_STRFTIME
            f_strftime
***************
*** 1646,1652 ****
            NULL
  #endif
                        },
!     {"strgetchar",    2, 2, FEARG_1,      NULL,
                        ret_number,         f_strgetchar},
      {"stridx",                2, 3, FEARG_1,      arg3_string_string_nr,
                        ret_number,         f_stridx},
--- 1671,1677 ----
            NULL
  #endif
                        },
!     {"strgetchar",    2, 2, FEARG_1,      arg2_string_nr,
                        ret_number,         f_strgetchar},
      {"stridx",                2, 3, FEARG_1,      arg3_string_string_nr,
                        ret_number,         f_stridx},
***************
*** 1696,1702 ****
                        ret_list_number,    f_tabpagebuflist},
      {"tabpagenr",     0, 1, 0,            arg1_string,
                        ret_number,         f_tabpagenr},
!     {"tabpagewinnr",  1, 2, FEARG_1,      NULL,
                        ret_number,         f_tabpagewinnr},
      {"tagfiles",      0, 0, 0,            NULL,
                        ret_list_string,    f_tagfiles},
--- 1721,1727 ----
                        ret_list_number,    f_tabpagebuflist},
      {"tabpagenr",     0, 1, 0,            arg1_string,
                        ret_number,         f_tabpagenr},
!     {"tabpagewinnr",  1, 2, FEARG_1,      arg2_nr_string,
                        ret_number,         f_tabpagewinnr},
      {"tagfiles",      0, 0, 0,            NULL,
                        ret_list_string,    f_tagfiles},
***************
*** 1724,1730 ****
            NULL
  #endif
                        },
!     {"term_getattr",  2, 2, FEARG_1,      NULL,
                        ret_number,         TERM_FUNC(f_term_getattr)},
      {"term_getcursor",        1, 1, FEARG_1,      arg1_string_or_nr,
                        ret_list_any,       TERM_FUNC(f_term_getcursor)},
--- 1749,1755 ----
            NULL
  #endif
                        },
!     {"term_getattr",  2, 2, FEARG_1,      arg2_nr_string,
                        ret_number,         TERM_FUNC(f_term_getattr)},
      {"term_getcursor",        1, 1, FEARG_1,      arg1_string_or_nr,
                        ret_list_any,       TERM_FUNC(f_term_getcursor)},
***************
*** 1806,1812 ****
                        ret_string,         f_test_null_string},
      {"test_option_not_set", 1, 1, FEARG_1,  arg1_string,
                        ret_void,           f_test_option_not_set},
!     {"test_override", 2, 2, FEARG_2,      NULL,
                        ret_void,           f_test_override},
      {"test_refcount", 1, 1, FEARG_1,      NULL,
                        ret_number,         f_test_refcount},
--- 1831,1837 ----
                        ret_string,         f_test_null_string},
      {"test_option_not_set", 1, 1, FEARG_1,  arg1_string,
                        ret_void,           f_test_option_not_set},
!     {"test_override", 2, 2, FEARG_2,      arg2_string_nr,
                        ret_void,           f_test_override},
      {"test_refcount", 1, 1, FEARG_1,      NULL,
                        ret_number,         f_test_refcount},
***************
*** 1858,1868 ****
                        ret_dict_any,       f_undotree},
      {"uniq",          1, 3, FEARG_1,      NULL,
                        ret_list_any,       f_uniq},
!     {"values",                1, 1, FEARG_1,      arg1_dict,
                        ret_list_any,       f_values},
      {"virtcol",               1, 1, FEARG_1,      arg1_string_or_list_any,
                        ret_number,         f_virtcol},
!     {"visualmode",    0, 1, 0,            NULL,
                        ret_string,         f_visualmode},
      {"wildmenumode",  0, 0, 0,            NULL,
                        ret_number,         f_wildmenumode},
--- 1883,1893 ----
                        ret_dict_any,       f_undotree},
      {"uniq",          1, 3, FEARG_1,      NULL,
                        ret_list_any,       f_uniq},
!     {"values",                1, 1, FEARG_1,      arg1_dict_any,
                        ret_list_any,       f_values},
      {"virtcol",               1, 1, FEARG_1,      arg1_string_or_list_any,
                        ret_number,         f_virtcol},
!     {"visualmode",    0, 1, 0,            arg1_bool,
                        ret_string,         f_visualmode},
      {"wildmenumode",  0, 0, 0,            NULL,
                        ret_number,         f_wildmenumode},
***************
*** 1900,1906 ****
                        ret_number,         f_winnr},
      {"winrestcmd",    0, 0, 0,            NULL,
                        ret_string,         f_winrestcmd},
!     {"winrestview",   1, 1, FEARG_1,      arg1_dict,
                        ret_void,           f_winrestview},
      {"winsaveview",   0, 0, 0,            NULL,
                        ret_dict_number,    f_winsaveview},
--- 1925,1931 ----
                        ret_number,         f_winnr},
      {"winrestcmd",    0, 0, 0,            NULL,
                        ret_string,         f_winrestcmd},
!     {"winrestview",   1, 1, FEARG_1,      arg1_dict_any,
                        ret_void,           f_winrestview},
      {"winsaveview",   0, 0, 0,            NULL,
                        ret_dict_number,    f_winsaveview},
***************
*** 2763,2770 ****
      static void
  f_echoraw(typval_T *argvars, typval_T *rettv UNUSED)
  {
!     char_u *str = tv_get_string_chk(&argvars[0]);
  
      if (str != NULL && *str != NUL)
      {
        out_str(str);
--- 2788,2799 ----
      static void
  f_echoraw(typval_T *argvars, typval_T *rettv UNUSED)
  {
!     char_u *str;
! 
!     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
!       return;
  
+     str = tv_get_string_chk(&argvars[0]);
      if (str != NULL && *str != NUL)
      {
        out_str(str);
***************
*** 5956,5961 ****
--- 5985,5994 ----
      dictitem_T        *di;
  
      rettv->vval.v_number = -1;
+ 
+     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+       return;
+ 
      end = get_lval(tv_get_string(&argvars[0]), NULL, &lv, FALSE, FALSE,
                             GLV_NO_AUTOLOAD | GLV_READ_ONLY, FNE_CHECK_START);
      if (end != NULL && lv.ll_name != NULL)
***************
*** 6122,6127 ****
--- 6155,6166 ----
      win_T     *save_curwin;
      tabpage_T *save_curtab;
  
+     if (in_vim9script()
+           && (check_for_string_arg(argvars, 0) == FAIL
+               || (argvars[1].v_type != VAR_UNKNOWN
+                   && check_for_number_arg(argvars, 1) == FAIL)))
+       return;
+ 
      if (argvars[1].v_type != VAR_UNKNOWN)
      {
        // use window specified in the second argument
*** ../vim-8.2.3161/src/evalwindow.c    2021-06-27 22:03:28.641707728 +0200
--- src/evalwindow.c    2021-07-15 10:53:45.238392517 +0200
***************
*** 653,658 ****
--- 653,664 ----
      int               nr = 1;
      tabpage_T *tp;
  
+     if (in_vim9script()
+           && (check_for_number_arg(argvars, 0) == FAIL
+               || (argvars[1].v_type != VAR_UNKNOWN
+                   && check_for_string_arg(argvars, 1) == FAIL)))
+       return;
+ 
      tp = find_tabpage((int)tv_get_number(&argvars[0]));
      if (tp == NULL)
        nr = 0;
*** ../vim-8.2.3161/src/filepath.c      2021-06-27 22:03:28.641707728 +0200
--- src/filepath.c      2021-07-15 10:53:45.238392517 +0200
***************
*** 1447,1452 ****
--- 1447,1458 ----
      char_u    *p;
      int               trim_len = 1;
  
+     if (in_vim9script()
+           && (check_for_string_arg(argvars, 0) == FAIL
+               || (argvars[1].v_type != VAR_UNKNOWN
+                   && check_for_number_arg(argvars, 1) == FAIL)))
+       return;
+ 
      if (argvars[1].v_type != VAR_UNKNOWN)
      {
        trim_len = (int)tv_get_number(&argvars[1]);
*** ../vim-8.2.3161/src/globals.h       2021-07-07 21:21:27.117414087 +0200
--- src/globals.h       2021-07-15 10:53:45.238392517 +0200
***************
*** 1698,1703 ****
--- 1698,1704 ----
  EXTERN char e_readonlyvar[]   INIT(= N_("E46: Cannot change read-only 
variable \"%s\""));
  EXTERN char e_readonlysbx[]   INIT(= N_("E794: Cannot set variable in the 
sandbox: \"%s\""));
  EXTERN char e_stringreq[]     INIT(= N_("E928: String required"));
+ EXTERN char e_numberreq[]     INIT(= N_("E889: Number required"));
  EXTERN char e_emptykey[]      INIT(= N_("E713: Cannot use empty key for 
Dictionary"));
  EXTERN char e_dictreq[]               INIT(= N_("E715: Dictionary required"));
  EXTERN char e_listidx[]               INIT(= N_("E684: list index out of 
range: %ld"));
*** ../vim-8.2.3161/src/popupwin.c      2021-06-27 22:03:28.645707721 +0200
--- src/popupwin.c      2021-07-15 10:53:45.238392517 +0200
***************
*** 2359,2371 ****
      void
  f_popup_filter_menu(typval_T *argvars, typval_T *rettv)
  {
!     int               id = tv_get_number(&argvars[0]);
!     win_T     *wp = win_id2wp(id);
!     char_u    *key = tv_get_string(&argvars[1]);
      typval_T  res;
      int               c;
      linenr_T  old_lnum;
  
      // If the popup has been closed do not consume the key.
      if (wp == NULL)
        return;
--- 2359,2379 ----
      void
  f_popup_filter_menu(typval_T *argvars, typval_T *rettv)
  {
!     int               id;
!     win_T     *wp;
!     char_u    *key;
      typval_T  res;
      int               c;
      linenr_T  old_lnum;
  
+     if (in_vim9script()
+           && (check_for_number_arg(argvars, 0) == FAIL
+               || check_for_string_arg(argvars, 1) == FAIL))
+       return;
+ 
+     id = tv_get_number(&argvars[0]);
+     wp = win_id2wp(id);
+     key = tv_get_string(&argvars[1]);
      // If the popup has been closed do not consume the key.
      if (wp == NULL)
        return;
***************
*** 2416,2427 ****
      void
  f_popup_filter_yesno(typval_T *argvars, typval_T *rettv)
  {
!     int               id = tv_get_number(&argvars[0]);
!     win_T     *wp = win_id2wp(id);
!     char_u    *key = tv_get_string(&argvars[1]);
      typval_T  res;
      int               c;
  
      // If the popup has been closed don't consume the key.
      if (wp == NULL)
        return;
--- 2424,2443 ----
      void
  f_popup_filter_yesno(typval_T *argvars, typval_T *rettv)
  {
!     int               id;
!     win_T     *wp;
!     char_u    *key;
      typval_T  res;
      int               c;
  
+     if (in_vim9script()
+           && (check_for_number_arg(argvars, 0) == FAIL
+               || check_for_string_arg(argvars, 1) == FAIL))
+       return;
+ 
+     id = tv_get_number(&argvars[0]);
+     wp = win_id2wp(id);
+     key = tv_get_string(&argvars[1]);
      // If the popup has been closed don't consume the key.
      if (wp == NULL)
        return;
***************
*** 2727,2735 ****
  f_popup_move(typval_T *argvars, typval_T *rettv UNUSED)
  {
      dict_T    *dict;
!     int               id = (int)tv_get_number(argvars);
!     win_T     *wp = find_popup_win(id);
  
      if (wp == NULL)
        return;  // invalid {id}
  
--- 2743,2758 ----
  f_popup_move(typval_T *argvars, typval_T *rettv UNUSED)
  {
      dict_T    *dict;
!     int               id;
!     win_T     *wp;
  
+     if (in_vim9script()
+           && (check_for_number_arg(argvars, 0) == FAIL
+               || check_for_dict_arg(argvars, 1) == FAIL))
+       return;
+ 
+     id = (int)tv_get_number(argvars);
+     wp = find_popup_win(id);
      if (wp == NULL)
        return;  // invalid {id}
  
***************
*** 2754,2763 ****
  f_popup_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
  {
      dict_T    *dict;
!     int               id = (int)tv_get_number(argvars);
!     win_T     *wp = find_popup_win(id);
      linenr_T  old_firstline;
  
      if (wp == NULL)
        return;  // invalid {id}
  
--- 2777,2793 ----
  f_popup_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
  {
      dict_T    *dict;
!     int               id;
!     win_T     *wp;
      linenr_T  old_firstline;
  
+     if (in_vim9script()
+           && (check_for_number_arg(argvars, 0) == FAIL
+               || check_for_dict_arg(argvars, 1) == FAIL))
+       return;
+ 
+     id = (int)tv_get_number(argvars);
+     wp = find_popup_win(id);
      if (wp == NULL)
        return;  // invalid {id}
  
*** ../vim-8.2.3161/src/proto/typval.pro        2021-07-10 13:15:35.291053015 
+0200
--- src/proto/typval.pro        2021-07-15 10:53:45.238392517 +0200
***************
*** 11,16 ****
--- 11,17 ----
  float_T tv_get_float(typval_T *varp);
  int check_for_string_arg(typval_T *args, int idx);
  int check_for_nonempty_string_arg(typval_T *args, int idx);
+ int check_for_number_arg(typval_T *args, int idx);
  int check_for_dict_arg(typval_T *args, int idx);
  char_u *tv_get_string(typval_T *varp);
  char_u *tv_get_string_strict(typval_T *varp);
*** ../vim-8.2.3161/src/sign.c  2020-08-31 23:17:57.503559788 +0200
--- src/sign.c  2021-07-15 10:53:45.238392517 +0200
***************
*** 2274,2280 ****
--- 2274,2284 ----
        return;
  
      if (argvars[0].v_type != VAR_UNKNOWN)
+     {
+       if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+           return;
        name = tv_get_string(&argvars[0]);
+     }
  
      sign_getlist(name, rettv->vval.v_list);
  }
*** ../vim-8.2.3161/src/strings.c       2021-07-10 21:28:55.331050104 +0200
--- src/strings.c       2021-07-15 10:53:45.238392517 +0200
***************
*** 795,803 ****
      char_u    *str;
      varnumber_T       idx;
  
      str = tv_get_string_chk(&argvars[0]);
      idx = tv_get_number_chk(&argvars[1], NULL);
-     rettv->vval.v_number = -1;
      if (str == NULL || idx < 0)
        return;
  
--- 795,809 ----
      char_u    *str;
      varnumber_T       idx;
  
+     rettv->vval.v_number = -1;
+ 
+     if (in_vim9script()
+           && (check_for_string_arg(argvars, 0) == FAIL
+               || check_for_number_arg(argvars, 1) == FAIL))
+       return;
+ 
      str = tv_get_string_chk(&argvars[0]);
      idx = tv_get_number_chk(&argvars[1], NULL);
      if (str == NULL || idx < 0)
        return;
  
***************
*** 981,986 ****
--- 987,998 ----
      int               byteidx = 0;
  
      rettv->vval.v_number = -1;
+ 
+     if (in_vim9script()
+           && (check_for_string_arg(argvars, 0) == FAIL
+               || check_for_number_arg(argvars, 1) == FAIL))
+       return;
+ 
      str = tv_get_string_chk(&argvars[0]);
      if (str == NULL)
        return;
***************
*** 1110,1118 ****
      void
  f_strdisplaywidth(typval_T *argvars, typval_T *rettv)
  {
!     char_u    *s = tv_get_string(&argvars[0]);
      int               col = 0;
  
      if (argvars[1].v_type != VAR_UNKNOWN)
        col = (int)tv_get_number(&argvars[1]);
  
--- 1122,1139 ----
      void
  f_strdisplaywidth(typval_T *argvars, typval_T *rettv)
  {
!     char_u    *s;
      int               col = 0;
  
+     rettv->vval.v_number = -1;
+ 
+     if (in_vim9script()
+           && (check_for_string_arg(argvars, 0) == FAIL
+               || (argvars[1].v_type != VAR_UNKNOWN
+                   && check_for_number_arg(argvars, 1) == FAIL)))
+       return;
+ 
+     s = tv_get_string(&argvars[0]);
      if (argvars[1].v_type != VAR_UNKNOWN)
        col = (int)tv_get_number(&argvars[1]);
  
*** ../vim-8.2.3161/src/terminal.c      2021-07-10 13:15:35.295053013 +0200
--- src/terminal.c      2021-07-15 10:53:45.238392517 +0200
***************
*** 5689,5694 ****
--- 5689,5699 ----
        {"reverse",   HL_INVERSE},
      };
  
+     if (in_vim9script()
+           && (check_for_number_arg(argvars, 0) == FAIL
+               || check_for_string_arg(argvars, 1) == FAIL))
+       return;
+ 
      attr = tv_get_number(&argvars[0]);
      name = tv_get_string_chk(&argvars[1]);
      if (name == NULL)
*** ../vim-8.2.3161/src/testdir/test_normal.vim 2021-05-31 19:22:58.583454940 
+0200
--- src/testdir/test_normal.vim 2021-07-15 10:53:45.242392507 +0200
***************
*** 2614,2620 ****
    set noim
    call assert_equal('are   some words', getline(1))
    call assert_false(&insertmode)
!   call assert_beeps("normal! \<C-\>\<C-A>", 'xt')
  
    if has('cmdwin')
      " Using CTRL-\ CTRL-N in cmd window should close the window
--- 2614,2620 ----
    set noim
    call assert_equal('are   some words', getline(1))
    call assert_false(&insertmode)
!   call assert_beeps("normal! \<C-\>\<C-A>")
  
    if has('cmdwin')
      " Using CTRL-\ CTRL-N in cmd window should close the window
*** ../vim-8.2.3161/src/testdir/test_reltime.vim        2020-04-26 
15:59:51.206952132 +0200
--- src/testdir/test_reltime.vim        2021-07-15 10:53:45.242392507 +0200
***************
*** 24,31 ****
    call assert_true(reltimefloat(differs) < 0.1)
    call assert_true(reltimefloat(differs) > 0.0)
  
!   call assert_equal(0, reltime({}))
!   call assert_equal(0, reltime({}, {}))
  endfunc
  
  " vim: shiftwidth=2 sts=2 expandtab
--- 24,31 ----
    call assert_true(reltimefloat(differs) < 0.1)
    call assert_true(reltimefloat(differs) > 0.0)
  
!   call assert_equal([], reltime({}))
!   call assert_equal([], reltime({}, {}))
  endfunc
  
  " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.3161/src/testdir/test_vim9_builtin.vim   2021-07-14 
21:00:38.065084719 +0200
--- src/testdir/test_vim9_builtin.vim   2021-07-15 10:53:45.242392507 +0200
***************
*** 75,80 ****
--- 75,115 ----
    endif
  enddef
  
+ def Test_add_blob()
+   var b1: blob = 0z12
+   add(b1, 0x34)
+   assert_equal(0z1234, b1)
+ 
+   var b2: blob # defaults to empty blob
+   add(b2, 0x67)
+   assert_equal(0z67, b2)
+ 
+   var lines =<< trim END
+       var b: blob
+       add(b, "x")
+   END
+   CheckDefFailure(lines, 'E1012:', 2)
+ 
+   lines =<< trim END
+       add(test_null_blob(), 123)
+   END
+   CheckDefExecAndScriptFailure(lines, 'E1131:', 1)
+ 
+   lines =<< trim END
+       var b: blob = test_null_blob()
+       add(b, 123)
+   END
+   CheckDefExecFailure(lines, 'E1131:', 2)
+ 
+   # Getting variable with NULL blob allocates a new blob at script level
+   lines =<< trim END
+       vim9script
+       var b: blob = test_null_blob()
+       add(b, 123)
+   END
+   CheckScriptSuccess(lines)
+ enddef
+ 
  def Test_add_list()
    var l: list<number>  # defaults to empty list
    add(l, 9)
***************
*** 120,160 ****
    CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got 
number', 3)
  enddef
  
- def Test_add_blob()
-   var b1: blob = 0z12
-   add(b1, 0x34)
-   assert_equal(0z1234, b1)
- 
-   var b2: blob # defaults to empty blob
-   add(b2, 0x67)
-   assert_equal(0z67, b2)
- 
-   var lines =<< trim END
-       var b: blob
-       add(b, "x")
-   END
-   CheckDefFailure(lines, 'E1012:', 2)
- 
-   lines =<< trim END
-       add(test_null_blob(), 123)
-   END
-   CheckDefExecAndScriptFailure(lines, 'E1131:', 1)
- 
-   lines =<< trim END
-       var b: blob = test_null_blob()
-       add(b, 123)
-   END
-   CheckDefExecFailure(lines, 'E1131:', 2)
- 
-   # Getting variable with NULL blob allocates a new blob at script level
-   lines =<< trim END
-       vim9script
-       var b: blob = test_null_blob()
-       add(b, 123)
-   END
-   CheckScriptSuccess(lines)
- enddef
- 
  def Test_and()
    CheckDefAndScriptFailure2(['and("x", 0x2)'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
    CheckDefAndScriptFailure2(['and(0x1, "x")'], 'E1013: Argument 2: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
--- 155,160 ----
***************
*** 171,176 ****
--- 171,200 ----
  
    append(0, 'zero')
    assert_equal('zero', getline(1))
+   append(0, {a: 10})
+   assert_equal("{'a': 10}", getline(1))
+   append(0, function('min'))
+   assert_equal("function('min')", getline(1))
+   CheckDefAndScriptFailure2(['append([1], "x")'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E745: Using a List as a 
Number')
+   bwipe!
+ enddef
+ 
+ def Test_appendbufline()
+   new
+   var bnum: number = bufnr()
+   :wincmd w
+   appendbufline(bnum, 0, range(3))
+   var res1: number = appendbufline(bnum, 1, 'one')
+   assert_equal(0, res1)
+   var res2: bool = appendbufline(bnum, 3, 'two')
+   assert_equal(false, res2)
+   assert_equal(['0', 'one', '1', 'two', '2', ''], getbufline(bnum, 1, '$'))
+   appendbufline(bnum, 0, 'zero')
+   assert_equal(['zero'], getbufline(bnum, 1))
+   CheckDefFailure(['appendbufline([1], 1, "x")'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>')
+   CheckDefFailure(['appendbufline(1, [1], "x")'], 'E1013: Argument 2: type 
mismatch, expected string but got list<number>')
+   CheckDefFailure(['appendbufline(1, 1, {"a": 10})'], 'E1013: Argument 3: 
type mismatch, expected string but got dict<number>')
+   bnum->bufwinid()->win_gotoid()
    bwipe!
  enddef
  
***************
*** 190,195 ****
--- 214,223 ----
    CheckDefFailure(['argv("x", "y")'], 'E1013: Argument 1: type mismatch, 
expected number but got string')
  enddef
  
+ def Test_assert_beeps()
+   CheckDefAndScriptFailure2(['assert_beeps(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+ enddef
+ 
  def Test_assert_equalfile()
    CheckDefFailure(['assert_equalfile(1, "f2")'], 'E1013: Argument 1: type 
mismatch, expected string but got number')
    CheckDefFailure(['assert_equalfile("f1", true)'], 'E1013: Argument 2: type 
mismatch, expected string but got bool')
***************
*** 207,212 ****
--- 235,244 ----
    CheckDefFailure(['assert_match("a", "b", null)'], 'E1013: Argument 3: type 
mismatch, expected string but got special')
  enddef
  
+ def Test_assert_nobeep()
+   CheckDefAndScriptFailure2(['assert_nobeep(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+ enddef
+ 
  def Test_assert_notmatch()
    CheckDefFailure(['assert_notmatch({}, "b")'], 'E1013: Argument 1: type 
mismatch, expected string but got dict<unknown>')
    CheckDefFailure(['assert_notmatch("a", 1)'], 'E1013: Argument 2: type 
mismatch, expected string but got number')
***************
*** 328,333 ****
--- 360,375 ----
    assert_equal(-1, byte2line(0))
  enddef
  
+ def Test_byteidx()
+   CheckDefAndScriptFailure2(['byteidx(1, 2)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['byteidx("a", "b")'], 'E1013: Argument 2: type 
mismatch, expected number but got string', 'E1210: Number required for argument 
2')
+ enddef
+ 
+ def Test_byteidxcomp()
+   CheckDefAndScriptFailure2(['byteidxcomp(1, 2)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['byteidxcomp("a", "b")'], 'E1013: Argument 2: 
type mismatch, expected number but got string', 'E1210: Number required for 
argument 2')
+ enddef
+ 
  def Test_call_call()
    var l = [3, 2, 1]
    call('reverse', [l])
***************
*** 355,360 ****
--- 397,408 ----
    CheckDefFailure(['ch_close_in(true)'], 'E1013: Argument 1: type mismatch, 
expected channel but got bool')
  enddef
  
+ def Test_ch_getjob()
+   CheckDefAndScriptFailure2(['ch_getjob(1)'], 'E1013: Argument 1: type 
mismatch, expected channel but got number', 'E475: Invalid argument:')
+   CheckDefAndScriptFailure2(['ch_getjob({"a": 10})'], 'E1013: Argument 1: 
type mismatch, expected channel but got dict<number>', 'E731: Using a 
Dictionary as a String')
+   assert_equal(0, ch_getjob(test_null_channel()))
+ enddef
+ 
  def Test_ch_info()
    if !has('channel')
      CheckFeature channel
***************
*** 381,386 ****
--- 429,474 ----
    CheckDefAndScriptFailure2(['ch_open("a", [1])'], 'E1013: Argument 2: type 
mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required 
for argument 2')
  enddef
  
+ def Test_ch_read()
+   if !has('channel')
+     CheckFeature channel
+   endif
+   CheckDefAndScriptFailure2(['ch_read(1)'], 'E1013: Argument 1: type 
mismatch, expected channel but got number', 'E475: Invalid argument')
+   CheckDefAndScriptFailure2(['ch_read(test_null_channel(), [])'], 'E1013: 
Argument 2: type mismatch, expected dict<any> but got list<unknown>', 'E715: 
Dictionary required')
+ enddef
+ 
+ def Test_ch_readblob()
+   if !has('channel')
+     CheckFeature channel
+   endif
+   CheckDefAndScriptFailure2(['ch_readblob(1)'], 'E1013: Argument 1: type 
mismatch, expected channel but got number', 'E475: Invalid argument')
+   CheckDefAndScriptFailure2(['ch_readblob(test_null_channel(), [])'], 'E1013: 
Argument 2: type mismatch, expected dict<any> but got list<unknown>', 'E715: 
Dictionary required')
+ enddef
+ 
+ def Test_ch_readraw()
+   if !has('channel')
+     CheckFeature channel
+   endif
+   CheckDefAndScriptFailure2(['ch_readraw(1)'], 'E1013: Argument 1: type 
mismatch, expected channel but got number', 'E475: Invalid argument')
+   CheckDefAndScriptFailure2(['ch_readraw(test_null_channel(), [])'], 'E1013: 
Argument 2: type mismatch, expected dict<any> but got list<unknown>', 'E715: 
Dictionary required')
+ enddef
+ 
+ def Test_ch_setoptions()
+   if !has('channel')
+     CheckFeature channel
+   endif
+   CheckDefAndScriptFailure2(['ch_setoptions(1, {})'], 'E1013: Argument 1: 
type mismatch, expected channel but got number', 'E475: Invalid argument')
+   CheckDefFailure(['ch_setoptions(test_null_channel(), [])'], 'E1013: 
Argument 2: type mismatch, expected dict<any> but got list<unknown>')
+ enddef
+ 
+ def Test_ch_status()
+   if !has('channel')
+     CheckFeature channel
+   endif
+   CheckDefAndScriptFailure2(['ch_status(1)'], 'E1013: Argument 1: type 
mismatch, expected channel but got number', 'E475: Invalid argument')
+   CheckDefAndScriptFailure2(['ch_status(test_null_channel(), [])'], 'E1013: 
Argument 2: type mismatch, expected dict<any> but got list<unknown>', 'E715: 
Dictionary required')
+ enddef
+ 
  def Test_char2nr()
    char2nr('あ', true)->assert_equal(12354)
  
***************
*** 440,445 ****
--- 528,540 ----
    bw!
  enddef
  
+ def Test_complete_info()
+   CheckDefFailure(['complete_info("")'], 'E1013: Argument 1: type mismatch, 
expected list<string> but got string')
+   CheckDefFailure(['complete_info({})'], 'E1013: Argument 1: type mismatch, 
expected list<string> but got dict<unknown>')
+   assert_equal({'pum_visible': 0, 'mode': '', 'selected': -1, 'items': []}, 
complete_info())
+   assert_equal({'mode': '', 'items': []}, complete_info(['mode', 'items']))
+ enddef
+ 
  def Test_confirm()
    if !has('dialog_con') && !has('dialog_gui')
      CheckFeature dialog_con
***************
*** 450,462 ****
    assert_fails('confirm("yes", "maybe", 2, true)', 'E1174:')
  enddef
  
- def Test_complete_info()
-   CheckDefFailure(['complete_info("")'], 'E1013: Argument 1: type mismatch, 
expected list<string> but got string')
-   CheckDefFailure(['complete_info({})'], 'E1013: Argument 1: type mismatch, 
expected list<string> but got dict<unknown>')
-   assert_equal({'pum_visible': 0, 'mode': '', 'selected': -1, 'items': []}, 
complete_info())
-   assert_equal({'mode': '', 'items': []}, complete_info(['mode', 'items']))
- enddef
- 
  def Test_copy_return_type()
    var l = copy([1, 2, 3])
    var res = 0
--- 545,550 ----
***************
*** 514,519 ****
--- 602,612 ----
    assert_equal(0, diff_filler('.'))
  enddef
  
+ def Test_echoraw()
+   CheckDefAndScriptFailure2(['echoraw(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['echoraw(["x"])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<string>', 'E1174: String required for 
argument 1')
+ enddef
+ 
  def Test_escape()
    CheckDefFailure(['escape("a", 10)'], 'E1013: Argument 2: type mismatch, 
expected string but got number')
    CheckDefFailure(['escape(10, " ")'], 'E1013: Argument 1: type mismatch, 
expected string but got number')
***************
*** 604,628 ****
    CheckDefExecFailure(['extend([1], ["b", 1])'], 'E1013: Argument 2: type 
mismatch, expected list<number> but got list<any>')
  enddef
  
- def Test_extendnew()
-   assert_equal([1, 2, 'a'], extendnew([1, 2], ['a']))
-   assert_equal({one: 1, two: 'a'}, extendnew({one: 1}, {two: 'a'}))
- 
-   CheckDefFailure(['extendnew({a: 1}, 42)'], 'E1013: Argument 2: type 
mismatch, expected dict<number> but got number')
-   CheckDefFailure(['extendnew({a: 1}, [42])'], 'E1013: Argument 2: type 
mismatch, expected dict<number> but got list<number>')
-   CheckDefFailure(['extendnew([1, 2], "x")'], 'E1013: Argument 2: type 
mismatch, expected list<number> but got string')
-   CheckDefFailure(['extendnew([1, 2], {x: 1})'], 'E1013: Argument 2: type 
mismatch, expected list<number> but got dict<number>')
- enddef
- 
- def Test_extend_return_type()
-   var l = extend([1, 2], [3])
-   var res = 0
-   for n in l
-     res += n
-   endfor
-   res->assert_equal(6)
- enddef
- 
  func g:ExtendDict(d)
    call extend(a:d, #{xx: 'x'})
  endfunc
--- 697,702 ----
***************
*** 673,678 ****
--- 747,761 ----
    CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1)
  enddef
  
+ def Test_extend_return_type()
+   var l = extend([1, 2], [3])
+   var res = 0
+   for n in l
+     res += n
+   endfor
+   res->assert_equal(6)
+ enddef
+ 
  def Test_extend_with_error_function()
    var lines =<< trim END
        vim9script
***************
*** 693,698 ****
--- 776,791 ----
    CheckScriptFailure(lines, 'E1001: Variable not found: m')
  enddef
  
+ def Test_extendnew()
+   assert_equal([1, 2, 'a'], extendnew([1, 2], ['a']))
+   assert_equal({one: 1, two: 'a'}, extendnew({one: 1}, {two: 'a'}))
+ 
+   CheckDefFailure(['extendnew({a: 1}, 42)'], 'E1013: Argument 2: type 
mismatch, expected dict<number> but got number')
+   CheckDefFailure(['extendnew({a: 1}, [42])'], 'E1013: Argument 2: type 
mismatch, expected dict<number> but got list<number>')
+   CheckDefFailure(['extendnew([1, 2], "x")'], 'E1013: Argument 2: type 
mismatch, expected list<number> but got string')
+   CheckDefFailure(['extendnew([1, 2], {x: 1})'], 'E1013: Argument 2: type 
mismatch, expected list<number> but got dict<number>')
+ enddef
+ 
  def Test_feedkeys()
    CheckDefFailure(['feedkeys(10)'], 'E1013: Argument 1: type mismatch, 
expected string but got number')
    CheckDefFailure(['feedkeys("x", 10)'], 'E1013: Argument 2: type mismatch, 
expected string but got number')
***************
*** 703,738 ****
    unlet g:TestVar
  enddef
  
- def Test_indent()
-   CheckDefAndScriptFailure2(['indent([1])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E745: Using a List as a 
Number')
-   CheckDefAndScriptFailure2(['indent(true)'], 'E1013: Argument 1: type 
mismatch, expected string but got bool', 'E1138: Using a Bool as a Number')
-   assert_equal(0, indent(1))
- enddef
- 
- def Test_input()
-   CheckDefFailure(['input(5)'], 'E1013: Argument 1: type mismatch, expected 
string but got number')
-   CheckDefAndScriptFailure2(['input(["a"])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<string>', 'E730: Using a List as a 
String')
-   CheckDefFailure(['input("p", 10)'], 'E1013: Argument 2: type mismatch, 
expected string but got number')
-   CheckDefAndScriptFailure2(['input("p", "q", 20)'], 'E1013: Argument 3: type 
mismatch, expected string but got number', 'E180: Invalid complete value')
- enddef
- 
- def Test_inputdialog()
-   CheckDefFailure(['inputdialog(5)'], 'E1013: Argument 1: type mismatch, 
expected string but got number')
-   CheckDefAndScriptFailure2(['inputdialog(["a"])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<string>', 'E730: Using a List as a 
String')
-   CheckDefFailure(['inputdialog("p", 10)'], 'E1013: Argument 2: type 
mismatch, expected string but got number')
-   CheckDefFailure(['inputdialog("p", "q", 20)'], 'E1013: Argument 3: type 
mismatch, expected string but got number')
- enddef
- 
- def Test_job_info_return_type()
-   if has('job')
-     job_start(&shell)
-     var jobs = job_info()
-     assert_equal('list<job>', typename(jobs))
-     assert_equal('dict<any>', typename(job_info(jobs[0])))
-     job_stop(jobs[0])
-   endif
- enddef
- 
  def Test_filereadable()
    assert_false(filereadable(""))
    assert_false(filereadable(test_null_string()))
--- 796,801 ----
***************
*** 928,933 ****
--- 991,998 ----
  
  def Test_garbagecollect()
    garbagecollect(true)
+   CheckDefAndScriptFailure2(['garbagecollect("1")'], 'E1013: Argument 1: type 
mismatch, expected bool but got string', 'E1135: Using a String as a Bool')
+   CheckDefAndScriptFailure2(['garbagecollect(20)'], 'E1013: Argument 1: type 
mismatch, expected bool but got number', 'E1023: Using a Number as a Bool')
  enddef
  
  def Test_getbufinfo()
***************
*** 967,972 ****
--- 1032,1050 ----
    while getchar(0)
    endwhile
    getchar(true)->assert_equal(0)
+   getchar(1)->assert_equal(0)
+   CheckDefAndScriptFailure2(['getchar(2)'], 'E1013: Argument 1: type 
mismatch, expected bool but got number', 'E1023: Using a Number as a Bool')
+   CheckDefAndScriptFailure2(['getchar("1")'], 'E1013: Argument 1: type 
mismatch, expected bool but got string', 'E1135: Using a String as a Bool')
+ enddef
+ 
+ def Test_getcharpos()
+   CheckDefAndScriptFailure2(['getcharpos(true)'], 'E1013: Argument 1: type 
mismatch, expected string but got bool', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['getcharpos(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+ enddef
+ 
+ def Test_getcharstr()
+   CheckDefAndScriptFailure2(['getcharstr(2)'], 'E1013: Argument 1: type 
mismatch, expected bool but got number', 'E1023: Using a Number as a Bool')
+   CheckDefAndScriptFailure2(['getcharstr("1")'], 'E1013: Argument 1: type 
mismatch, expected bool but got string', 'E1135: Using a String as a Bool')
  enddef
  
  def Test_getenv()
***************
*** 1003,1016 ****
    CheckDefFailure(['getcwd(1, "x")'], 'E1013: Argument 2: type mismatch, 
expected number but got string')
  enddef
  
- def Test_getloclist_return_type()
-   var l = getloclist(1)
-   l->assert_equal([])
- 
-   var d = getloclist(1, {items: 0})
-   d->assert_equal({items: []})
- enddef
- 
  def Test_getfontname()
    CheckDefFailure(['getfontname(10)'], 'E1013: Argument 1: type mismatch, 
expected string but got number')
  enddef
--- 1081,1086 ----
***************
*** 1072,1077 ****
--- 1142,1160 ----
    CheckDefExecAndScriptFailure(lines, 'E1209:')
  enddef
  
+ def Test_getloclist()
+   CheckDefAndScriptFailure2(['getloclist("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+   CheckDefAndScriptFailure2(['getloclist(1, [])'], 'E1013: Argument 2: type 
mismatch, expected dict<any> but got list<unknown>', 'E715: Dictionary 
required')
+ enddef
+ 
+ def Test_getloclist_return_type()
+   var l = getloclist(1)
+   l->assert_equal([])
+ 
+   var d = getloclist(1, {items: 0})
+   d->assert_equal({items: []})
+ enddef
+ 
  def Test_getmarklist()
    CheckDefFailure(['getmarklist([])'], 'E1013: Argument 1: type mismatch, 
expected string but got list<unknown>')
    assert_equal([], getmarklist(10000))
***************
*** 1197,1202 ****
--- 1280,1290 ----
    assert_equal('skyblue', histget('/', -1))
  enddef
  
+ def Test_histget()
+   CheckDefAndScriptFailure2(['histget(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['histget("a", "b")'], 'E1013: Argument 2: type 
mismatch, expected number but got string', 'E1210: Number required for argument 
2')
+ enddef
+ 
  def Test_histnr()
    CheckDefFailure(['histnr(10)'], 'E1013: Argument 1: type mismatch, expected 
string but got number')
    assert_equal(-1, histnr('abc'))
***************
*** 1219,1228 ****
--- 1307,1336 ----
    assert_equal('abc', iconv('abc', 'fromenc', 'toenc'))
  enddef
  
+ def Test_indent()
+   CheckDefAndScriptFailure2(['indent([1])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E745: Using a List as a 
Number')
+   CheckDefAndScriptFailure2(['indent(true)'], 'E1013: Argument 1: type 
mismatch, expected string but got bool', 'E1138: Using a Bool as a Number')
+   assert_equal(0, indent(1))
+ enddef
+ 
  def Test_index()
    index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3)
  enddef
  
+ def Test_input()
+   CheckDefFailure(['input(5)'], 'E1013: Argument 1: type mismatch, expected 
string but got number')
+   CheckDefAndScriptFailure2(['input(["a"])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<string>', 'E730: Using a List as a 
String')
+   CheckDefFailure(['input("p", 10)'], 'E1013: Argument 2: type mismatch, 
expected string but got number')
+   CheckDefAndScriptFailure2(['input("p", "q", 20)'], 'E1013: Argument 3: type 
mismatch, expected string but got number', 'E180: Invalid complete value')
+ enddef
+ 
+ def Test_inputdialog()
+   CheckDefFailure(['inputdialog(5)'], 'E1013: Argument 1: type mismatch, 
expected string but got number')
+   CheckDefAndScriptFailure2(['inputdialog(["a"])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<string>', 'E730: Using a List as a 
String')
+   CheckDefFailure(['inputdialog("p", 10)'], 'E1013: Argument 2: type 
mismatch, expected string but got number')
+   CheckDefFailure(['inputdialog("p", "q", 20)'], 'E1013: Argument 3: type 
mismatch, expected string but got number')
+ enddef
+ 
  def Test_inputlist()
    CheckDefFailure(['inputlist(10)'], 'E1013: Argument 1: type mismatch, 
expected list<string> but got number')
    CheckDefFailure(['inputlist("abc")'], 'E1013: Argument 1: type mismatch, 
expected list<string> but got string')
***************
*** 1289,1300 ****
--- 1397,1443 ----
    assert_false(isdirectory('NonExistingDir'))
  enddef
  
+ def Test_islocked()
+   CheckDefAndScriptFailure2(['islocked(true)'], 'E1013: Argument 1: type 
mismatch, expected string but got bool', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['var n1: number = 10', 'islocked(n1)'], 'E1013: 
Argument 1: type mismatch, expected string but got number', 'E1174: String 
required for argument 1')
+   g:v1 = 10
+   assert_false(islocked('g:v1'))
+   lockvar g:v1
+   assert_true(islocked('g:v1'))
+   unlet g:v1
+ enddef
+ 
  def Test_items()
    CheckDefFailure(['[]->items()'], 'E1013: Argument 1: type mismatch, 
expected dict<any> but got list<unknown>')
    assert_equal([['a', 10], ['b', 20]], {'a': 10, 'b': 20}->items())
    assert_equal([], {}->items())
  enddef
  
+ def Test_job_getchannel()
+   CheckDefAndScriptFailure2(['job_getchannel("a")'], 'E1013: Argument 1: type 
mismatch, expected job but got string', 'E475: Invalid argument')
+   assert_fails('job_getchannel(test_null_job())', 'E916: not a valid job')
+ enddef
+ 
+ def Test_job_info()
+   CheckDefAndScriptFailure2(['job_info("a")'], 'E1013: Argument 1: type 
mismatch, expected job but got string', 'E475: Invalid argument')
+   assert_fails('job_info(test_null_job())', 'E916: not a valid job')
+ enddef
+ 
+ def Test_job_info_return_type()
+   if has('job')
+     job_start(&shell)
+     var jobs = job_info()
+     assert_equal('list<job>', typename(jobs))
+     assert_equal('dict<any>', typename(job_info(jobs[0])))
+     job_stop(jobs[0])
+   endif
+ enddef
+ 
+ def Test_job_status()
+   CheckDefAndScriptFailure2(['job_status("a")'], 'E1013: Argument 1: type 
mismatch, expected job but got string', 'E475: Invalid argument')
+   assert_equal('fail', job_status(test_null_job()))
+ enddef
+ 
  def Test_js_decode()
    CheckDefFailure(['js_decode(10)'], 'E1013: Argument 1: type mismatch, 
expected string but got number')
    assert_equal([1, 2], js_decode('[1,2]'))
***************
*** 1318,1323 ****
--- 1461,1468 ----
  
  def Test_line()
    assert_fails('line(true)', 'E1174:')
+   CheckDefAndScriptFailure2(['line(1)'], 'E1013: Argument 1: type mismatch, 
expected string but got number', 'E1174: String required for argument 1')
+   CheckDefAndScriptFailure2(['line(".", "a")'], 'E1013: Argument 2: type 
mismatch, expected number but got string', 'E1210: Number required for argument 
2')
  enddef
  
  def Test_line2byte()
***************
*** 1476,1481 ****
--- 1621,1627 ----
            ? [1, max([2, 3])]
            : [4, 5]
    assert_equal([4, 5], l2)
+   CheckDefAndScriptFailure2(['max(5)'], 'E1013: Argument 1: type mismatch, 
expected list<any> but got number', 'E712: Argument of max() must be a List or 
Dictionary')
  enddef
  
  def Test_menu_info()
***************
*** 1497,1502 ****
--- 1643,1649 ----
            ? [1, min([2, 3])]
            : [4, 5]
    assert_equal([4, 5], l2)
+   CheckDefAndScriptFailure2(['min(5)'], 'E1013: Argument 1: type mismatch, 
expected list<any> but got number', 'E712: Argument of min() must be a List or 
Dictionary')
  enddef
  
  def Test_mkdir()
***************
*** 1506,1511 ****
--- 1653,1670 ----
    delete('a', 'rf')
  enddef
  
+ def Test_mode()
+   CheckDefFailure(['mode("1")'], 'E1013: Argument 1: type mismatch, expected 
bool but got string')
+   CheckDefFailure(['mode(2)'], 'E1013: Argument 1: type mismatch, expected 
bool but got number')
+ enddef
+ 
+ def Test_mzeval()
+   if !has('mzscheme')
+     CheckFeature mzscheme
+   endif
+   CheckDefAndScriptFailure2(['mzscheme(["a"])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<string>', 'E730: Using a List as a 
String')
+ enddef
+ 
  def Test_nextnonblank()
    CheckDefFailure(['nextnonblank(null)'], 'E1013: Argument 1: type mismatch, 
expected string but got special')
    assert_equal(0, nextnonblank(1))
***************
*** 1520,1525 ****
--- 1679,1696 ----
    CheckDefFailure(['or(0x1, "x")'], 'E1013: Argument 2: type mismatch, 
expected number but got string')
  enddef
  
+ def Test_pathshorten()
+   CheckDefAndScriptFailure2(['pathshorten(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['pathshorten("a", "x")'], 'E1013: Argument 2: 
type mismatch, expected number but got string', 'E1210: Number required for 
argument 2')
+ enddef
+ 
+ def Test_perleval()
+   if !has('perl')
+     CheckFeature perl
+   endif
+   CheckDefAndScriptFailure2(['perleval(["a"])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<string>', 'E730: Using a List as a 
String')
+ enddef
+ 
  def Test_popup_atcursor()
    CheckDefAndScriptFailure2(['popup_atcursor({"a": 10}, {})'], 'E1013: 
Argument 1: type mismatch, expected string but got dict<number>', 'E450: buffer 
number, text or a list required')
    CheckDefAndScriptFailure2(['popup_atcursor("a", [1, 2])'], 'E1013: Argument 
2: type mismatch, expected dict<any> but got list<number>', 'E715: Dictionary 
required')
***************
*** 1536,1541 ****
--- 1707,1717 ----
    CheckDefAndScriptFailure2(['popup_beval("a", [1, 2])'], 'E1013: Argument 2: 
type mismatch, expected dict<any> but got list<number>', 'E715: Dictionary 
required')
  enddef
  
+ def Test_popup_clear()
+   CheckDefAndScriptFailure2(['popup_clear(["a"])'], 'E1013: Argument 1: type 
mismatch, expected bool but got list<string>', 'E745: Using a List as a Number')
+   CheckDefAndScriptFailure2(['popup_clear(2)'], 'E1013: Argument 1: type 
mismatch, expected bool but got number', 'E1023: Using a Number as a Bool')
+ enddef
+ 
  def Test_popup_create()
    # Pass variable of type 'any' to popup_create()
    var what: any = 'Hello'
***************
*** 1549,1554 ****
--- 1725,1755 ----
    CheckDefAndScriptFailure2(['popup_dialog("a", [1, 2])'], 'E1013: Argument 
2: type mismatch, expected dict<any> but got list<number>', 'E715: Dictionary 
required')
  enddef
  
+ def Test_popup_filter_menu()
+   CheckDefAndScriptFailure2(['popup_filter_menu("x", "")'], 'E1013: Argument 
1: type mismatch, expected number but got string', 'E1210: Number required for 
argument 1')
+   CheckDefAndScriptFailure2(['popup_filter_menu(1, 1)'], 'E1013: Argument 2: 
type mismatch, expected string but got number', 'E1174: String required for 
argument 2')
+ enddef
+ 
+ def Test_popup_filter_yesno()
+   CheckDefAndScriptFailure2(['popup_filter_yesno("x", "")'], 'E1013: Argument 
1: type mismatch, expected number but got string', 'E1210: Number required for 
argument 1')
+   CheckDefAndScriptFailure2(['popup_filter_yesno(1, 1)'], 'E1013: Argument 2: 
type mismatch, expected string but got number', 'E1174: String required for 
argument 2')
+ enddef
+ 
+ def Test_popup_getoptions()
+   CheckDefAndScriptFailure2(['popup_getoptions("a")'], 'E1013: Argument 1: 
type mismatch, expected number but got string', 'E1030: Using a String as a 
Number')
+   CheckDefAndScriptFailure2(['popup_getoptions(true)'], 'E1013: Argument 1: 
type mismatch, expected number but got bool', 'E1138: Using a Bool as a Number')
+ enddef
+ 
+ def Test_popup_getpos()
+   CheckDefAndScriptFailure2(['popup_getpos("a")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+   CheckDefAndScriptFailure2(['popup_getpos(true)'], 'E1013: Argument 1: type 
mismatch, expected number but got bool', 'E1138: Using a Bool as a Number')
+ enddef
+ 
+ def Test_popup_hide()
+   CheckDefAndScriptFailure2(['popup_hide("a")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+   CheckDefAndScriptFailure2(['popup_hide(true)'], 'E1013: Argument 1: type 
mismatch, expected number but got bool', 'E1138: Using a Bool as a Number')
+ enddef
+ 
  def Test_popup_locate()
    CheckDefAndScriptFailure2(['popup_locate("a", 20)'], 'E1013: Argument 1: 
type mismatch, expected number but got string', 'E1030: Using a String as a 
Number')
    CheckDefAndScriptFailure2(['popup_locate(10, "b")'], 'E1013: Argument 2: 
type mismatch, expected number but got string', 'E1030: Using a String as a 
Number')
***************
*** 1559,1569 ****
--- 1760,1785 ----
    CheckDefAndScriptFailure2(['popup_menu("a", [1, 2])'], 'E1013: Argument 2: 
type mismatch, expected dict<any> but got list<number>', 'E715: Dictionary 
required')
  enddef
  
+ def Test_popup_move()
+   CheckDefAndScriptFailure2(['popup_move("x", {})'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1210: Number required for argument 
1')
+   CheckDefAndScriptFailure2(['popup_move(1, [])'], 'E1013: Argument 2: type 
mismatch, expected dict<any> but got list<unknown>', 'E1206: Dictionary 
required for argument 2')
+ enddef
+ 
  def Test_popup_notification()
    CheckDefAndScriptFailure2(['popup_notification({"a": 10}, {})'], 'E1013: 
Argument 1: type mismatch, expected string but got dict<number>', 'E450: buffer 
number, text or a list required')
    CheckDefAndScriptFailure2(['popup_notification("a", [1, 2])'], 'E1013: 
Argument 2: type mismatch, expected dict<any> but got list<number>', 'E715: 
Dictionary required')
  enddef
  
+ def Test_popup_setoptions()
+   CheckDefAndScriptFailure2(['popup_setoptions("x", {})'], 'E1013: Argument 
1: type mismatch, expected number but got string', 'E1210: Number required for 
argument 1')
+   CheckDefAndScriptFailure2(['popup_setoptions(1, [])'], 'E1013: Argument 2: 
type mismatch, expected dict<any> but got list<unknown>', 'E1206: Dictionary 
required for argument 2')
+ enddef
+ 
+ def Test_popup_show()
+   CheckDefAndScriptFailure2(['popup_show("a")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+   CheckDefAndScriptFailure2(['popup_show(true)'], 'E1013: Argument 1: type 
mismatch, expected number but got bool', 'E1138: Using a Bool as a Number')
+ enddef
+ 
  def Test_prevnonblank()
    CheckDefFailure(['prevnonblank(null)'], 'E1013: Argument 1: type mismatch, 
expected string but got special')
    assert_equal(0, prevnonblank(1))
***************
*** 1582,1587 ****
--- 1798,1808 ----
    CheckDefAndScriptFailure2(['prop_find({"a": 10}, ["a"])'], 'E1013: Argument 
2: type mismatch, expected string but got list<string>', 'E730: Using a List as 
a String')
  enddef
  
+ def Test_prop_list()
+   CheckDefAndScriptFailure2(['prop_list("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1210: Number required for argument 
1')
+   CheckDefAndScriptFailure2(['prop_list(1, [])'], 'E1013: Argument 2: type 
mismatch, expected dict<any> but got list<unknown>', 'E1206: Dictionary 
required for argument 2')
+ enddef
+ 
  def Test_prop_type_add()
    CheckDefAndScriptFailure2(['prop_type_add({"a": 10}, "b")'], 'E1013: 
Argument 1: type mismatch, expected string but got dict<number>', 'E731: Using 
a Dictionary as a String')
    CheckDefAndScriptFailure2(['prop_type_add("a", "b")'], 'E1013: Argument 2: 
type mismatch, expected dict<any> but got string', 'E715: Dictionary required')
***************
*** 1604,1609 ****
--- 1825,1856 ----
    CheckDefAndScriptFailure2(['prop_type_get("a", "b")'], 'E1013: Argument 2: 
type mismatch, expected dict<any> but got string', 'E715: Dictionary required')
  enddef
  
+ def Test_prop_type_list()
+   CheckDefAndScriptFailure2(['prop_type_list(["a"])'], 'E1013: Argument 1: 
type mismatch, expected dict<any> but got list<string>', 'E715: Dictionary 
required')
+   CheckDefAndScriptFailure2(['prop_type_list(2)'], 'E1013: Argument 1: type 
mismatch, expected dict<any> but got number', 'E715: Dictionary required')
+ enddef
+ 
+ def Test_py3eval()
+   if !has('python3')
+     CheckFeature python3
+   endif
+   CheckDefAndScriptFailure2(['py3eval([2])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E730: Using a List as a 
String')
+ enddef
+ 
+ def Test_pyeval()
+   if !has('python')
+     CheckFeature python
+   endif
+   CheckDefAndScriptFailure2(['pyeval([2])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E730: Using a List as a 
String')
+ enddef
+ 
+ def Test_pyxeval()
+   if !has('python') && !has('python3')
+     CheckFeature python
+   endif
+   CheckDefAndScriptFailure2(['pyxeval([2])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E730: Using a List as a 
String')
+ enddef
+ 
  def Test_rand()
    CheckDefFailure(['rand(10)'], 'E1013: Argument 1: type mismatch, expected 
list<number> but got number')
    CheckDefFailure(['rand(["a"])'], 'E1013: Argument 1: type mismatch, 
expected list<number> but got list<string>')
***************
*** 1704,1709 ****
--- 1951,1963 ----
    CheckDefAndScriptFailure2(['remote_peek("a5b6c7", [1])'], 'E1013: Argument 
2: type mismatch, expected string but got list<number>', 'E573: Invalid server 
id used')
  enddef
  
+ def Test_remote_read()
+   CheckFeature clientserver
+   CheckEnv DISPLAY
+   CheckDefAndScriptFailure2(['remote_read(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['remote_read("a", "x")'], 'E1013: Argument 2: 
type mismatch, expected number but got string', 'E1210: Number required for 
argument 2')
+ enddef
+ 
  def Test_remote_startserver()
    CheckFeature clientserver
    CheckEnv DISPLAY
***************
*** 1743,1748 ****
--- 1997,2009 ----
    res->assert_equal(6)
  enddef
  
+ def Test_rubyeval()
+   if !has('ruby')
+     CheckFeature ruby
+   endif
+   CheckDefAndScriptFailure2(['rubyeval([2])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E730: Using a List as a 
String')
+ enddef
+ 
  def Test_screenattr()
    CheckDefFailure(['screenattr("x", 1)'], 'E1013: Argument 1: type mismatch, 
expected number but got string')
    CheckDefFailure(['screenattr(1, "x")'], 'E1013: Argument 2: type mismatch, 
expected number but got string')
***************
*** 1813,1818 ****
--- 2074,2080 ----
            maxcount: 99,
            incomplete: 0})
    bwipe!
+   CheckDefAndScriptFailure2(['searchcount([1])'], 'E1013: Argument 1: type 
mismatch, expected dict<any> but got list<number>', 'E715: Dictionary required')
  enddef
  
  def Test_searchpair()
***************
*** 1956,1961 ****
--- 2218,2244 ----
    CheckDefFailure(['setfperm("a", 0z10)'], 'E1013: Argument 2: type mismatch, 
expected string but got blob')
  enddef
  
+ def Test_setbufline()
+   new
+   var bnum = bufnr('%')
+   :wincmd w
+   setbufline(bnum, 1, range(1, 3))
+   setbufline(bnum, 4, 'one')
+   setbufline(bnum, 5, 10)
+   setbufline(bnum, 6, ['two', 11])
+   assert_equal(['1', '2', '3', 'one', '10', 'two', '11'], getbufline(bnum, 1, 
'$'))
+   CheckDefFailure(['setbufline([1], 1, "x")'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>')
+   CheckDefFailure(['setbufline(1, [1], "x")'], 'E1013: Argument 2: type 
mismatch, expected string but got list<number>')
+   CheckDefFailure(['setbufline(1, 1, {"a": 10})'], 'E1013: Argument 3: type 
mismatch, expected string but got dict<number>')
+   bnum->bufwinid()->win_gotoid()
+   bw!
+ enddef
+ 
+ def Test_setcellwidths()
+   CheckDefAndScriptFailure2(['setcellwidths(1)'], 'E1013: Argument 1: type 
mismatch, expected list<any> but got number', 'E714: List required')
+   CheckDefAndScriptFailure2(['setcellwidths({"a": 10})'], 'E1013: Argument 1: 
type mismatch, expected list<any> but got dict<number>', 'E714: List required')
+ enddef
+ 
  def Test_setline()
    new
    setline(1, range(1, 4))
***************
*** 1964,1969 ****
--- 2247,2255 ----
    assert_equal(['a', 'b', 'c', 'd'], getline(1, '$'))
    setline(1, 'one')
    assert_equal(['one', 'b', 'c', 'd'], getline(1, '$'))
+   setline(1, 10)
+   assert_equal(['10', 'b', 'c', 'd'], getline(1, '$'))
+   CheckDefAndScriptFailure2(['setline([1], "x")'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E745: Using a List as a 
Number')
    bw!
  enddef
  
***************
*** 1998,2003 ****
--- 2284,2299 ----
    CheckDefAndScriptFailure2(['sign_define("a", ["b"])'], 'E1013: Argument 2: 
type mismatch, expected dict<any> but got list<string>', 'E715: Dictionary 
required')
  enddef
  
+ def Test_sign_getdefined()
+   CheckDefAndScriptFailure2(['sign_getdefined(["x"])'], 'E1013: Argument 1: 
type mismatch, expected string but got list<string>', 'E1174: String required 
for argument 1')
+   CheckDefAndScriptFailure2(['sign_getdefined(2)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+ enddef
+ 
+ def Test_sign_placelist()
+   CheckDefAndScriptFailure2(['sign_placelist("x")'], 'E1013: Argument 1: type 
mismatch, expected list<any> but got string', 'E714: List required')
+   CheckDefAndScriptFailure2(['sign_placelist({"a": 10})'], 'E1013: Argument 
1: type mismatch, expected list<any> but got dict<number>', 'E714: List 
required')
+ enddef
+ 
  def Test_sign_undefine()
    CheckDefAndScriptFailure2(['sign_undefine({})'], 'E1013: Argument 1: type 
mismatch, expected string but got dict<unknown>', 'E731: Using a Dictionary as 
a String')
    CheckDefAndScriptFailure2(['sign_undefine([1])'], 'E1013: Argument 1: type 
mismatch, expected list<string> but got list<number>', 'E155: Unknown sign:')
***************
*** 2009,2014 ****
--- 2305,2315 ----
    CheckDefAndScriptFailure2(['sign_unplace("a", ["b"])'], 'E1013: Argument 2: 
type mismatch, expected dict<any> but got list<string>', 'E715: Dictionary 
required')
  enddef
  
+ def Test_sign_unplacelist()
+   CheckDefAndScriptFailure2(['sign_unplacelist("x")'], 'E1013: Argument 1: 
type mismatch, expected list<any> but got string', 'E714: List required')
+   CheckDefAndScriptFailure2(['sign_unplacelist({"a": 10})'], 'E1013: Argument 
1: type mismatch, expected list<any> but got dict<number>', 'E714: List 
required')
+ enddef
+ 
  def Test_simplify()
    CheckDefFailure(['simplify(100)'], 'E1013: Argument 1: type mismatch, 
expected string but got number')
    call assert_equal('NonExistingFile', simplify('NonExistingFile'))
***************
*** 2117,2126 ****
--- 2418,2448 ----
    CheckScriptFailure(['vim9script', 'echo str2nr("123", 10, "x")'], 'E1135:')
  enddef
  
+ def Test_strcharlen()
+   CheckDefAndScriptFailure2(['strcharlen([1])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E730: Using a List as a 
String')
+   "abc"->strcharlen()->assert_equal(3)
+   strcharlen(99)->assert_equal(2)
+ enddef
+ 
  def Test_strchars()
    strchars("A\u20dd", true)->assert_equal(1)
  enddef
  
+ def Test_strdisplaywidth()
+   CheckDefAndScriptFailure2(['strdisplaywidth(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['strdisplaywidth("a", "x")'], 'E1013: Argument 
2: type mismatch, expected number but got string', 'E1210: Number required for 
argument 2')
+ enddef
+ 
+ def Test_strftime()
+   CheckDefAndScriptFailure2(['strftime(1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['strftime("a", "x")'], 'E1013: Argument 2: type 
mismatch, expected number but got string', 'E1210: Number required for argument 
2')
+ enddef
+ 
+ def Test_strgetchar()
+   CheckDefAndScriptFailure2(['strgetchar(1, 1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['strgetchar("a", "x")'], 'E1013: Argument 2: 
type mismatch, expected number but got string', 'E1210: Number required for 
argument 2')
+ enddef
+ 
  def Test_stridx()
    CheckDefAndScriptFailure2(['stridx([1], "b")'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E730: Using a List as a 
String')
    CheckDefAndScriptFailure2(['stridx("a", {})'], 'E1013: Argument 2: type 
mismatch, expected string but got dict<unknown>', 'E731: Using a Dictionary as 
a String')
***************
*** 2211,2216 ****
--- 2533,2543 ----
    assert_equal(1, tabpagenr())
  enddef
  
+ def Test_tabpagewinnr()
+   CheckDefAndScriptFailure2(['tabpagewinnr("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1210: Number required for argument 
1')
+   CheckDefAndScriptFailure2(['tabpagewinnr(1, 2)'], 'E1013: Argument 2: type 
mismatch, expected string but got number', 'E1174: String required for argument 
2')
+ enddef
+ 
  def Test_taglist()
    CheckDefAndScriptFailure2(['taglist([1])'], 'E1013: Argument 1: type 
mismatch, expected string but got list<number>', 'E730: Using a List as a 
String')
    CheckDefAndScriptFailure2(['taglist("a", [2])'], 'E1013: Argument 2: type 
mismatch, expected string but got list<number>', 'E730: Using a List as a 
String')
***************
*** 2234,2239 ****
--- 2561,2572 ----
    CheckDefAndScriptFailure2(['term_getansicolors(["a"])'], 'E1013: Argument 
1: type mismatch, expected string but got list<string>', 'E745: Using a List as 
a Number')
  enddef
  
+ def Test_term_getattr()
+   CheckRunVimInTerminal
+   CheckDefAndScriptFailure2(['term_getattr("x", "a")'], 'E1013: Argument 1: 
type mismatch, expected number but got string', 'E1210: Number required for 
argument 1')
+   CheckDefAndScriptFailure2(['term_getattr(1, 2)'], 'E1013: Argument 2: type 
mismatch, expected string but got number', 'E1174: String required for argument 
2')
+ enddef
+ 
  def Test_term_getcursor()
    CheckRunVimInTerminal
    CheckDefAndScriptFailure2(['term_getcursor({"a": 10})'], 'E1013: Argument 
1: type mismatch, expected string but got dict<number>', 'E728: Using a 
Dictionary as a Number')
***************
*** 2310,2315 ****
--- 2643,2653 ----
    CheckDefAndScriptFailure2(['test_option_not_set([])'], 'E1013: Argument 1: 
type mismatch, expected string but got list<unknown>', 'E474: Invalid argument')
  enddef
  
+ def Test_test_override()
+   CheckDefAndScriptFailure2(['test_override(1, 1)'], 'E1013: Argument 1: type 
mismatch, expected string but got number', 'E1174: String required for argument 
1')
+   CheckDefAndScriptFailure2(['test_override("a", "x")'], 'E1013: Argument 2: 
type mismatch, expected number but got string', 'E1210: Number required for 
argument 2')
+ enddef
+ 
  def Test_test_setmouse()
    CheckDefAndScriptFailure2(['test_setmouse("a", 10)'], 'E1013: Argument 1: 
type mismatch, expected number but got string', 'E474: Invalid argument')
    CheckDefAndScriptFailure2(['test_setmouse(10, "b")'], 'E1013: Argument 2: 
type mismatch, expected number but got string', 'E474: Invalid argument')
***************
*** 2392,2397 ****
--- 2730,2740 ----
    bw!
  enddef
  
+ def Test_visualmode()
+   CheckDefFailure(['visualmode("1")'], 'E1013: Argument 1: type mismatch, 
expected bool but got string')
+   CheckDefFailure(['visualmode(2)'], 'E1013: Argument 1: type mismatch, 
expected bool but got number')
+ enddef
+ 
  def Test_win_execute()
    assert_equal("\n" .. winnr(), win_execute(win_getid(), 'echo winnr()'))
    assert_equal("\n" .. winnr(), 'echo winnr()'->win_execute(win_getid()))
***************
*** 2411,2422 ****
--- 2754,2797 ----
    assert_equal(win_getid(), win_getid(1, 1))
  enddef
  
+ def Test_win_gettype()
+   CheckDefAndScriptFailure2(['win_gettype("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+ enddef
+ 
+ def Test_win_gotoid()
+   CheckDefAndScriptFailure2(['win_gotoid("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+ enddef
+ 
+ def Test_win_id2tabwin()
+   CheckDefAndScriptFailure2(['win_id2tabwin("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+ enddef
+ 
+ def Test_win_id2win()
+   CheckDefAndScriptFailure2(['win_id2win("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+ enddef
+ 
+ def Test_win_screenpos()
+   CheckDefAndScriptFailure2(['win_screenpos("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+ enddef
+ 
  def Test_win_splitmove()
    split
    win_splitmove(1, 2, {vertical: true, rightbelow: true})
    close
  enddef
  
+ def Test_winbufnr()
+   CheckDefAndScriptFailure2(['winbufnr("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+ enddef
+ 
+ def Test_winheight()
+   CheckDefAndScriptFailure2(['winheight("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+ enddef
+ 
+ def Test_winlayout()
+   CheckDefAndScriptFailure2(['winlayout("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
+ enddef
+ 
  def Test_winnr()
    CheckDefFailure(['winnr([])'], 'E1013: Argument 1: type mismatch, expected 
string but got list<unknown>')
    assert_equal(1, winnr())
***************
*** 2449,2486 ****
    CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected 
list<number> but got dict<number>', 1)
  enddef
  
- def Test_win_gettype()
-   CheckDefAndScriptFailure2(['win_gettype("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
- enddef
- 
- def Test_win_gotoid()
-   CheckDefAndScriptFailure2(['win_gotoid("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
- enddef
- 
- def Test_win_id2tabwin()
-   CheckDefAndScriptFailure2(['win_id2tabwin("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
- enddef
- 
- def Test_win_id2win()
-   CheckDefAndScriptFailure2(['win_id2win("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
- enddef
- 
- def Test_win_screenpos()
-   CheckDefAndScriptFailure2(['win_screenpos("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
- enddef
- 
- def Test_winbufnr()
-   CheckDefAndScriptFailure2(['winbufnr("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
- enddef
- 
- def Test_winheight()
-   CheckDefAndScriptFailure2(['winheight("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
- enddef
- 
- def Test_winlayout()
-   CheckDefAndScriptFailure2(['winlayout("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
- enddef
- 
  def Test_winwidth()
    CheckDefAndScriptFailure2(['winwidth("x")'], 'E1013: Argument 1: type 
mismatch, expected number but got string', 'E1030: Using a String as a Number')
  enddef
--- 2824,2829 ----
*** ../vim-8.2.3161/src/testdir/test_vim9_expr.vim      2021-07-11 
20:58:54.788028521 +0200
--- src/testdir/test_vim9_expr.vim      2021-07-15 10:53:45.242392507 +0200
***************
*** 2982,2988 ****
      enddef
      RetVoid()->byteidx(3)
    END
!   CheckDefExecAndScriptFailure(lines, 'E1031:')
  enddef
  
  
--- 2982,2988 ----
      enddef
      RetVoid()->byteidx(3)
    END
!   CheckDefExecFailure(lines, 'E1013:')
  enddef
  
  
*** ../vim-8.2.3161/src/testing.c       2021-07-11 19:44:14.114416536 +0200
--- src/testing.c       2021-07-15 10:53:45.242392507 +0200
***************
*** 340,349 ****
      static int
  assert_beeps(typval_T *argvars, int no_beep)
  {
!     char_u    *cmd = tv_get_string_chk(&argvars[0]);
      garray_T  ga;
      int               ret = 0;
  
      called_vim_beep = FALSE;
      suppress_errthrow = TRUE;
      emsg_silent = FALSE;
--- 340,353 ----
      static int
  assert_beeps(typval_T *argvars, int no_beep)
  {
!     char_u    *cmd;
      garray_T  ga;
      int               ret = 0;
  
+     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+       return 0;
+ 
+     cmd = tv_get_string_chk(&argvars[0]);
      called_vim_beep = FALSE;
      suppress_errthrow = TRUE;
      emsg_silent = FALSE;
***************
*** 367,373 ****
  }
  
  /*
!  * "assert_beeps(cmd [, error])" function
   */
      void
  f_assert_beeps(typval_T *argvars, typval_T *rettv)
--- 371,377 ----
  }
  
  /*
!  * "assert_beeps(cmd)" function
   */
      void
  f_assert_beeps(typval_T *argvars, typval_T *rettv)
***************
*** 376,382 ****
  }
  
  /*
!  * "assert_nobeep(cmd [, error])" function
   */
      void
  f_assert_nobeep(typval_T *argvars, typval_T *rettv)
--- 380,386 ----
  }
  
  /*
!  * "assert_nobeep(cmd)" function
   */
      void
  f_assert_nobeep(typval_T *argvars, typval_T *rettv)
***************
*** 947,952 ****
--- 951,961 ----
      int     val;
      static int save_starting = -1;
  
+     if (in_vim9script()
+           && (check_for_string_arg(argvars, 0) == FAIL
+               || check_for_number_arg(argvars, 1) == FAIL))
+       return;
+ 
      if (argvars[0].v_type != VAR_STRING
            || (argvars[1].v_type) != VAR_NUMBER)
        emsg(_(e_invarg));
*** ../vim-8.2.3161/src/textprop.c      2021-07-10 13:15:35.295053013 +0200
--- src/textprop.c      2021-07-15 10:53:45.242392507 +0200
***************
*** 769,777 ****
      void
  f_prop_list(typval_T *argvars, typval_T *rettv)
  {
!     linenr_T lnum = tv_get_number(&argvars[0]);
      buf_T    *buf = curbuf;
  
      if (argvars[1].v_type != VAR_UNKNOWN)
      {
        if (get_bufnr_from_arg(&argvars[1], &buf) == FAIL)
--- 769,784 ----
      void
  f_prop_list(typval_T *argvars, typval_T *rettv)
  {
!     linenr_T lnum;
      buf_T    *buf = curbuf;
  
+     if (in_vim9script()
+           && (check_for_number_arg(argvars, 0) == FAIL
+               || (argvars[1].v_type != VAR_UNKNOWN &&
+                   check_for_dict_arg(argvars, 1) == FAIL)))
+       return;
+ 
+     lnum = tv_get_number(&argvars[0]);
      if (argvars[1].v_type != VAR_UNKNOWN)
      {
        if (get_bufnr_from_arg(&argvars[1], &buf) == FAIL)
*** ../vim-8.2.3161/src/time.c  2021-07-14 21:00:38.065084719 +0200
--- src/time.c  2021-07-15 10:53:45.242392507 +0200
***************
*** 169,174 ****
--- 169,178 ----
  # ifdef FEAT_RELTIME
      proftime_T        res;
      proftime_T        start;
+     long      n1, n2;
+ 
+     if (rettv_list_alloc(rettv) != OK)
+       return;
  
      if (argvars[0].v_type == VAR_UNKNOWN)
      {
***************
*** 198,217 ****
        profile_sub(&res, &start);
      }
  
-     if (rettv_list_alloc(rettv) == OK)
-     {
-       long    n1, n2;
- 
  #  ifdef MSWIN
!       n1 = res.HighPart;
!       n2 = res.LowPart;
  #  else
!       n1 = res.tv_sec;
!       n2 = res.tv_usec;
  #  endif
!       list_append_number(rettv->vval.v_list, (varnumber_T)n1);
!       list_append_number(rettv->vval.v_list, (varnumber_T)n2);
!     }
  # endif
  }
  
--- 202,216 ----
        profile_sub(&res, &start);
      }
  
  #  ifdef MSWIN
!     n1 = res.HighPart;
!     n2 = res.LowPart;
  #  else
!     n1 = res.tv_sec;
!     n2 = res.tv_usec;
  #  endif
!     list_append_number(rettv->vval.v_list, (varnumber_T)n1);
!     list_append_number(rettv->vval.v_list, (varnumber_T)n2);
  # endif
  }
  
***************
*** 269,274 ****
--- 268,279 ----
      time_t    seconds;
      char_u    *p;
  
+     if (in_vim9script()
+           && (check_for_string_arg(argvars, 0) == FAIL
+               || (argvars[1].v_type != VAR_UNKNOWN
+                   && check_for_number_arg(argvars, 1) == FAIL)))
+       return;
+ 
      rettv->v_type = VAR_STRING;
  
      p = tv_get_string(&argvars[0]);
*** ../vim-8.2.3161/src/typval.c        2021-07-10 13:15:35.295053013 +0200
--- src/typval.c        2021-07-15 10:53:45.242392507 +0200
***************
*** 385,390 ****
--- 385,407 ----
  }
  
  /*
+  * Give an error and return FAIL unless "tv" is a number.
+  */
+     int
+ check_for_number_arg(typval_T *args, int idx)
+ {
+     if (args[idx].v_type != VAR_NUMBER)
+     {
+       if (idx >= 0)
+           semsg(_(e_number_required_for_argument_nr), idx + 1);
+       else
+           emsg(_(e_numberreq));
+       return FAIL;
+     }
+     return OK;
+ }
+ 
+ /*
   * Give an error and return FAIL unless "tv" is a dict.
   */
      int
*** ../vim-8.2.3161/src/version.c       2021-07-14 21:00:38.065084719 +0200
--- src/version.c       2021-07-15 10:55:23.678141626 +0200
***************
*** 757,758 ****
--- 757,760 ----
  {   /* Add new patch number below this line */
+ /**/
+     3162,
  /**/

-- 
We are the Borg of GNU GPL.  We will assimilate your source code.
Resistance is futile.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202107151050.16FAoSon1856578%40masaka.moolenaar.net.

Raspunde prin e-mail lui