Patch 9.0.1224
Problem:    Cannot call a :def function with a number for a float argument.
Solution:   Accept a number as well, convert it to a float.
Files:      src/vim9type.c, src/globals.h, src/vim9execute.c,
            src/structs.h, src/testdir/test_vim9_func.vim


*** ../vim-9.0.1223/src/vim9type.c      2023-01-16 16:39:33.491018024 +0000
--- src/vim9type.c      2023-01-20 18:32:46.034812447 +0000
***************
*** 628,639 ****
  {
      type_T *type = typval2type_int(tv, copyID, type_gap, flags);
  
!     if (type != NULL && type != &t_bool
!           && (tv->v_type == VAR_NUMBER
                    && (tv->vval.v_number == 0 || tv->vval.v_number == 1)))
!       // Number 0 and 1 and expression with "&&" or "||" can also be used for
!       // bool.
!       type = &t_number_bool;
      return type;
  }
  
--- 628,644 ----
  {
      type_T *type = typval2type_int(tv, copyID, type_gap, flags);
  
!     if (type != NULL)
!     {
!       if (type != &t_bool && (tv->v_type == VAR_NUMBER
                    && (tv->vval.v_number == 0 || tv->vval.v_number == 1)))
!           // Number 0 and 1 and expression with "&&" or "||" can also be used
!           // for bool.
!           type = &t_number_bool;
!       else if (type != &t_float && tv->v_type == VAR_NUMBER)
!           // A number can also be used for float.
!           type = &t_number_float;
!     }
      return type;
  }
  
***************
*** 821,829 ****
                // Using number 0 or 1 for bool is OK.
                return OK;
            if (expected->tt_type == VAR_FLOAT
!                   && (expected->tt_flags & TTFLAG_NUMBER_OK)
!                                       && actual->tt_type == VAR_NUMBER)
!               // Using number where float is expected is OK here.
                return OK;
            if (give_msg)
                type_mismatch_where(expected, actual, where);
--- 826,835 ----
                // Using number 0 or 1 for bool is OK.
                return OK;
            if (expected->tt_type == VAR_FLOAT
!                   && actual->tt_type == VAR_NUMBER
!                   && ((expected->tt_flags & TTFLAG_NUMBER_OK)
!                            || (actual->tt_flags & TTFLAG_FLOAT_OK)))
!               // Using a number where a float is expected is OK here.
                return OK;
            if (give_msg)
                type_mismatch_where(expected, actual, where);
*** ../vim-9.0.1223/src/globals.h       2023-01-14 11:46:09.704717821 +0000
--- src/globals.h       2023-01-20 17:43:39.470115266 +0000
***************
*** 430,536 ****
  #define t_number_bool         (static_types[14])
  #define t_const_number_bool   (static_types[15])
  
! #define t_float                       (static_types[16])
! #define t_const_float         (static_types[17])
  
! #define t_string              (static_types[18])
! #define t_const_string                (static_types[19])
  
! #define t_blob                        (static_types[20])
! #define t_const_blob          (static_types[21])
  
! #define t_blob_null           (static_types[22])
! #define t_const_blob_null     (static_types[23])
  
! #define t_job                 (static_types[24])
! #define t_const_job           (static_types[25])
  
! #define t_channel             (static_types[26])
! #define t_const_channel               (static_types[27])
  
  // t_number_or_string - Special value used for @#.
! #define t_number_or_string    (static_types[28])
! #define t_const_number_or_string (static_types[29])
  
  // t_func_unknown - function with any arguments and no or unknown return value
! #define t_func_unknown                (static_types[30])
! #define t_const_func_unknown  (static_types[31])
  
  // t_func_void - function with any arguments and no return value
! #define t_func_void           (static_types[32])
! #define t_const_func_void     (static_types[33])
  
! #define t_func_any            (static_types[34])
! #define t_const_func_any      (static_types[35])
  
! #define t_func_number         (static_types[36])
! #define t_const_func_number   (static_types[37])
  
! #define t_func_string         (static_types[38])
! #define t_const_func_string   (static_types[39])
  
! #define t_func_bool           (static_types[40])
! #define t_const_func_bool     (static_types[41])
  
  // t_func_0_void - function without arguments and nor return value
! #define t_func_0_void         (static_types[42])
! #define t_const_func_0_void   (static_types[43])
  
! #define t_func_0_any          (static_types[44])
! #define t_const_func_0_any    (static_types[45])
  
! #define t_func_0_number               (static_types[46])
! #define t_const_func_0_number (static_types[47])
  
! #define t_func_0_string               (static_types[48])
! #define t_const_func_0_string (static_types[49])
  
! #define t_list_any            (static_types[50])
! #define t_const_list_any      (static_types[51])
  
! #define t_dict_any            (static_types[52])
! #define t_const_dict_any      (static_types[53])
  
! #define t_list_empty          (static_types[54])
! #define t_const_list_empty    (static_types[55])
  
! #define t_dict_empty          (static_types[56])
! #define t_const_dict_empty    (static_types[57])
  
! #define t_list_bool           (static_types[58])
! #define t_const_list_bool     (static_types[59])
  
! #define t_list_number         (static_types[60])
! #define t_const_list_number   (static_types[61])
  
! #define t_list_string         (static_types[62])
! #define t_const_list_string   (static_types[63])
  
! #define t_list_job            (static_types[64])
! #define t_const_list_job      (static_types[65])
  
! #define t_list_dict_any               (static_types[66])
! #define t_const_list_dict_any (static_types[67])
  
! #define t_list_list_any               (static_types[68])
! #define t_const_list_list_any (static_types[69])
  
! #define t_list_list_string    (static_types[70])
! #define t_const_list_list_string (static_types[71])
  
! #define t_dict_bool           (static_types[72])
! #define t_const_dict_bool     (static_types[73])
  
! #define t_dict_number         (static_types[74])
! #define t_const_dict_number   (static_types[75])
  
! #define t_dict_string         (static_types[76])
! #define t_const_dict_string   (static_types[77])
  
! #define t_super                       (static_types[78])
! #define t_const_super         (static_types[79])
  
! EXTERN type_T static_types[80]
  #ifdef DO_INIT
  = {
      // 0: t_unknown
--- 430,540 ----
  #define t_number_bool         (static_types[14])
  #define t_const_number_bool   (static_types[15])
  
! // t_number_float - number that can be used as a float
! #define t_number_float                (static_types[16])
! #define t_const_number_float  (static_types[17])
  
! #define t_float                       (static_types[18])
! #define t_const_float         (static_types[19])
  
! #define t_string              (static_types[20])
! #define t_const_string                (static_types[21])
  
! #define t_blob                        (static_types[22])
! #define t_const_blob          (static_types[23])
  
! #define t_blob_null           (static_types[24])
! #define t_const_blob_null     (static_types[25])
  
! #define t_job                 (static_types[26])
! #define t_const_job           (static_types[27])
! 
! #define t_channel             (static_types[28])
! #define t_const_channel               (static_types[29])
  
  // t_number_or_string - Special value used for @#.
! #define t_number_or_string    (static_types[30])
! #define t_const_number_or_string (static_types[31])
  
  // t_func_unknown - function with any arguments and no or unknown return value
! #define t_func_unknown                (static_types[32])
! #define t_const_func_unknown  (static_types[33])
  
  // t_func_void - function with any arguments and no return value
! #define t_func_void           (static_types[34])
! #define t_const_func_void     (static_types[35])
  
! #define t_func_any            (static_types[36])
! #define t_const_func_any      (static_types[37])
  
! #define t_func_number         (static_types[38])
! #define t_const_func_number   (static_types[39])
  
! #define t_func_string         (static_types[40])
! #define t_const_func_string   (static_types[41])
  
! #define t_func_bool           (static_types[42])
! #define t_const_func_bool     (static_types[43])
  
  // t_func_0_void - function without arguments and nor return value
! #define t_func_0_void         (static_types[44])
! #define t_const_func_0_void   (static_types[45])
  
! #define t_func_0_any          (static_types[46])
! #define t_const_func_0_any    (static_types[47])
  
! #define t_func_0_number               (static_types[48])
! #define t_const_func_0_number (static_types[49])
  
! #define t_func_0_string               (static_types[50])
! #define t_const_func_0_string (static_types[51])
  
! #define t_list_any            (static_types[52])
! #define t_const_list_any      (static_types[53])
  
! #define t_dict_any            (static_types[54])
! #define t_const_dict_any      (static_types[55])
  
! #define t_list_empty          (static_types[56])
! #define t_const_list_empty    (static_types[57])
  
! #define t_dict_empty          (static_types[58])
! #define t_const_dict_empty    (static_types[59])
  
! #define t_list_bool           (static_types[60])
! #define t_const_list_bool     (static_types[61])
  
! #define t_list_number         (static_types[62])
! #define t_const_list_number   (static_types[63])
  
! #define t_list_string         (static_types[64])
! #define t_const_list_string   (static_types[65])
  
! #define t_list_job            (static_types[66])
! #define t_const_list_job      (static_types[67])
  
! #define t_list_dict_any               (static_types[68])
! #define t_const_list_dict_any (static_types[69])
  
! #define t_list_list_any               (static_types[70])
! #define t_const_list_list_any (static_types[71])
  
! #define t_list_list_string    (static_types[72])
! #define t_const_list_list_string (static_types[73])
  
! #define t_dict_bool           (static_types[74])
! #define t_const_dict_bool     (static_types[75])
  
! #define t_dict_number         (static_types[76])
! #define t_const_dict_number   (static_types[77])
  
! #define t_dict_string         (static_types[78])
! #define t_const_dict_string   (static_types[79])
  
! #define t_super                       (static_types[80])
! #define t_const_super         (static_types[81])
  
! EXTERN type_T static_types[82]
  #ifdef DO_INIT
  = {
      // 0: t_unknown
***************
*** 565,695 ****
      {VAR_NUMBER, 0, 0, TTFLAG_STATIC|TTFLAG_BOOL_OK, NULL, NULL},
      {VAR_NUMBER, 0, 0, TTFLAG_STATIC|TTFLAG_BOOL_OK|TTFLAG_CONST, NULL, NULL},
  
!     // 16: t_float
      {VAR_FLOAT, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_FLOAT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 18: t_string
      {VAR_STRING, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_STRING, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 20: t_blob
      {VAR_BLOB, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_BLOB, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 22: t_blob_null
      {VAR_BLOB, 0, 0, TTFLAG_STATIC, &t_void, NULL},
      {VAR_BLOB, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_void, NULL},
  
!     // 24: t_job
      {VAR_JOB, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_JOB, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 26: t_channel
      {VAR_CHANNEL, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_CHANNEL, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 28: t_number_or_string
      {VAR_STRING, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_STRING, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 30: t_func_unknown
      {VAR_FUNC, -1, -1, TTFLAG_STATIC, &t_unknown, NULL},
      {VAR_FUNC, -1, -1, TTFLAG_STATIC|TTFLAG_CONST, &t_unknown, NULL},
  
!     // 32: t_func_void
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_void, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_void, NULL},
  
!     // 34: t_func_any
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_any, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_any, NULL},
  
!     // 36: t_func_number
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_number, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_number, NULL},
  
!     // 38: t_func_string
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_string, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_string, NULL},
  
!     // 40: t_func_bool
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_bool, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_bool, NULL},
  
!     // 42: t_func_0_void
      {VAR_FUNC, 0, 0, TTFLAG_STATIC, &t_void, NULL},
      {VAR_FUNC, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_void, NULL},
  
!     // 44: t_func_0_any
      {VAR_FUNC, 0, 0, TTFLAG_STATIC, &t_any, NULL},
      {VAR_FUNC, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_any, NULL},
  
!     // 46: t_func_0_number
      {VAR_FUNC, 0, 0, TTFLAG_STATIC, &t_number, NULL},
      {VAR_FUNC, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_number, NULL},
  
!     // 48: t_func_0_string
      {VAR_FUNC, 0, 0, TTFLAG_STATIC, &t_string, NULL},
      {VAR_FUNC, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_string, NULL},
  
!     // 50: t_list_any
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_any, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_any, NULL},
  
!     // 52: t_dict_any
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_any, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_any, NULL},
  
!     // 54: t_list_empty
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_unknown, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_unknown, NULL},
  
!     // 56: t_dict_empty
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_unknown, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_unknown, NULL},
  
!     // 58: t_list_bool
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_bool, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_bool, NULL},
  
!     // 60: t_list_number
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_number, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_number, NULL},
  
!     // 62: t_list_string
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_string, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_string, NULL},
  
!     // 64: t_list_job
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_job, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_job, NULL},
  
!     // 66: t_list_dict_any
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_dict_any, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_dict_any, NULL},
  
!     // 68: t_list_list_any
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_list_any, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_list_any, NULL},
  
!     // 70: t_list_list_string
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_list_string, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_list_string, NULL},
  
!     // 72: t_dict_bool
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_bool, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_bool, NULL},
  
!     // 74: t_dict_number
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_number, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_number, NULL},
  
!     // 76: t_dict_string
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_string, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_string, NULL},
  
!     // 78: t_super (VAR_CLASS with tt_member set to &t_bool
      {VAR_CLASS, 0, 0, TTFLAG_STATIC, &t_bool, NULL},
      {VAR_CLASS, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_bool, NULL},
  }
--- 569,703 ----
      {VAR_NUMBER, 0, 0, TTFLAG_STATIC|TTFLAG_BOOL_OK, NULL, NULL},
      {VAR_NUMBER, 0, 0, TTFLAG_STATIC|TTFLAG_BOOL_OK|TTFLAG_CONST, NULL, NULL},
  
!     // 16: t_number_float
!     {VAR_NUMBER, 0, 0, TTFLAG_STATIC|TTFLAG_FLOAT_OK, NULL, NULL},
!     {VAR_NUMBER, 0, 0, TTFLAG_STATIC|TTFLAG_FLOAT_OK|TTFLAG_CONST, NULL, 
NULL},
! 
!     // 18: t_float
      {VAR_FLOAT, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_FLOAT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 20: t_string
      {VAR_STRING, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_STRING, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 22: t_blob
      {VAR_BLOB, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_BLOB, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 24: t_blob_null
      {VAR_BLOB, 0, 0, TTFLAG_STATIC, &t_void, NULL},
      {VAR_BLOB, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_void, NULL},
  
!     // 26: t_job
      {VAR_JOB, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_JOB, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 28: t_channel
      {VAR_CHANNEL, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_CHANNEL, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 30: t_number_or_string
      {VAR_STRING, 0, 0, TTFLAG_STATIC, NULL, NULL},
      {VAR_STRING, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, NULL, NULL},
  
!     // 32: t_func_unknown
      {VAR_FUNC, -1, -1, TTFLAG_STATIC, &t_unknown, NULL},
      {VAR_FUNC, -1, -1, TTFLAG_STATIC|TTFLAG_CONST, &t_unknown, NULL},
  
!     // 34: t_func_void
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_void, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_void, NULL},
  
!     // 36: t_func_any
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_any, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_any, NULL},
  
!     // 38: t_func_number
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_number, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_number, NULL},
  
!     // 40: t_func_string
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_string, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_string, NULL},
  
!     // 42: t_func_bool
      {VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_bool, NULL},
      {VAR_FUNC, -1, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_bool, NULL},
  
!     // 44: t_func_0_void
      {VAR_FUNC, 0, 0, TTFLAG_STATIC, &t_void, NULL},
      {VAR_FUNC, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_void, NULL},
  
!     // 46: t_func_0_any
      {VAR_FUNC, 0, 0, TTFLAG_STATIC, &t_any, NULL},
      {VAR_FUNC, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_any, NULL},
  
!     // 48: t_func_0_number
      {VAR_FUNC, 0, 0, TTFLAG_STATIC, &t_number, NULL},
      {VAR_FUNC, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_number, NULL},
  
!     // 50: t_func_0_string
      {VAR_FUNC, 0, 0, TTFLAG_STATIC, &t_string, NULL},
      {VAR_FUNC, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_string, NULL},
  
!     // 52: t_list_any
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_any, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_any, NULL},
  
!     // 54: t_dict_any
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_any, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_any, NULL},
  
!     // 56: t_list_empty
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_unknown, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_unknown, NULL},
  
!     // 58: t_dict_empty
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_unknown, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_unknown, NULL},
  
!     // 60: t_list_bool
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_bool, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_bool, NULL},
  
!     // 62: t_list_number
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_number, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_number, NULL},
  
!     // 64: t_list_string
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_string, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_string, NULL},
  
!     // 66: t_list_job
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_job, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_job, NULL},
  
!     // 68: t_list_dict_any
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_dict_any, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_dict_any, NULL},
  
!     // 70: t_list_list_any
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_list_any, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_list_any, NULL},
  
!     // 72: t_list_list_string
      {VAR_LIST, 0, 0, TTFLAG_STATIC, &t_list_string, NULL},
      {VAR_LIST, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_list_string, NULL},
  
!     // 74: t_dict_bool
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_bool, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_bool, NULL},
  
!     // 76: t_dict_number
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_number, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_number, NULL},
  
!     // 78: t_dict_string
      {VAR_DICT, 0, 0, TTFLAG_STATIC, &t_string, NULL},
      {VAR_DICT, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_string, NULL},
  
!     // 80: t_super (VAR_CLASS with tt_member set to &t_bool
      {VAR_CLASS, 0, 0, TTFLAG_STATIC, &t_bool, NULL},
      {VAR_CLASS, 0, 0, TTFLAG_STATIC|TTFLAG_CONST, &t_bool, NULL},
  }
*** ../vim-9.0.1223/src/vim9execute.c   2023-01-16 20:47:53.889287080 +0000
--- src/vim9execute.c   2023-01-20 18:34:54.394881461 +0000
***************
*** 5822,5833 ****
        }
        else
        {
!           if (ufunc->uf_arg_types != NULL && idx < ufunc->uf_args.ga_len
!                   && check_typval_arg_type(
!                       ufunc->uf_arg_types[idx], tv,
                                                   NULL, argv_idx + 1) == FAIL)
!               goto failed_early;
!           copy_tv(tv, STACK_TV_BOT(0));
        }
        ++ectx.ec_stack.ga_len;
      }
--- 5822,5846 ----
        }
        else
        {
!           int done = FALSE;
!           if (ufunc->uf_arg_types != NULL && idx < ufunc->uf_args.ga_len)
!           {
!               type_T *expected = ufunc->uf_arg_types[idx];
!               if (expected->tt_type == VAR_FLOAT && tv->v_type == VAR_NUMBER)
!               {
!                   // When a float is expected and a number was given, convert
!                   // the value.
!                   STACK_TV_BOT(0)->v_type = VAR_FLOAT;
!                   STACK_TV_BOT(0)->v_lock = 0;
!                   STACK_TV_BOT(0)->vval.v_float = tv->vval.v_number;
!                   done = TRUE;
!               }
!               else if (check_typval_arg_type(expected, tv,
                                                   NULL, argv_idx + 1) == FAIL)
!                   goto failed_early;
!       }
!           if (!done)
!               copy_tv(tv, STACK_TV_BOT(0));
        }
        ++ectx.ec_stack.ga_len;
      }
*** ../vim-9.0.1223/src/structs.h       2023-01-16 19:43:43.390873675 +0000
--- src/structs.h       2023-01-20 18:36:35.102928179 +0000
***************
*** 1462,1471 ****
  
  #define TTFLAG_VARARGS            0x01    // func args ends with "..."
  #define TTFLAG_BOOL_OK            0x02    // can be converted to bool
! #define TTFLAG_NUMBER_OK    0x04    // tt_type is VAR_FLOAT, VAR_NUMBER is OK
! #define TTFLAG_STATIC     0x08    // one of the static types, e.g. t_any
! #define TTFLAG_CONST      0x10    // cannot be changed
! #define TTFLAG_SUPER      0x20    // object from "super".
  
  typedef enum {
      ACCESS_PRIVATE,   // read/write only inside th class
--- 1462,1472 ----
  
  #define TTFLAG_VARARGS            0x01    // func args ends with "..."
  #define TTFLAG_BOOL_OK            0x02    // can be converted to bool
! #define TTFLAG_FLOAT_OK           0x04    // number can be used/converted to 
float
! #define TTFLAG_NUMBER_OK    0x08    // number can be used for a float
! #define TTFLAG_STATIC     0x10    // one of the static types, e.g. t_any
! #define TTFLAG_CONST      0x20    // cannot be changed
! #define TTFLAG_SUPER      0x40    // object from "super".
  
  typedef enum {
      ACCESS_PRIVATE,   // read/write only inside th class
*** ../vim-9.0.1223/src/testdir/test_vim9_func.vim      2023-01-03 
12:33:23.082974364 +0000
--- src/testdir/test_vim9_func.vim      2023-01-20 18:19:20.413874054 +0000
***************
*** 727,732 ****
--- 727,744 ----
    v9.CheckScriptSuccess(lines)
  enddef
  
+ def Test_convert_number_to_float()
+   var lines =<< trim END
+       vim9script
+       def  Foo(a: float, b: float): float
+          return a + b
+       enddef
+ 
+       assert_equal(5.3, Foo(3.3, 2))
+   END
+   v9.CheckScriptSuccess(lines)
+ enddef
+ 
  def s:FuncWithComment(  # comment
    a: number, #comment
    b: bool, # comment
***************
*** 4311,4320 ****
          return sum
        enddef
  
!       const ml = [3.0, 2, 7]
        echo Scan(ml)->Sum()
    END
!   v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected 
float but got number')
  enddef
  
  def Test_multiple_funcref()
--- 4323,4332 ----
          return sum
        enddef
  
!       const ml = [3.0, 2, '7']
        echo Scan(ml)->Sum()
    END
!   v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected 
float but got string')
  enddef
  
  def Test_multiple_funcref()
*** ../vim-9.0.1223/src/version.c       2023-01-20 16:00:49.542341277 +0000
--- src/version.c       2023-01-20 18:19:48.045931752 +0000
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1224,
  /**/

-- 
Due knot trussed yore spell chequer two fined awl miss steaks.

 /// 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/20230120185027.60EE81C09EE%40moolenaar.net.

Raspunde prin e-mail lui