]> granicus.if.org Git - vim/commitdiff
patch 8.2.0548: Vim9: not all possible func type errors tested v8.2.0548
authorBram Moolenaar <Bram@vim.org>
Sat, 11 Apr 2020 21:17:17 +0000 (23:17 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 11 Apr 2020 21:17:17 +0000 (23:17 +0200)
Problem:    Vim9: not all possible func type errors tested.
Solution:   Add more tests.

src/testdir/test_vim9_func.vim
src/version.c
src/vim9compile.c

index 470e880e0fdd5ee154fd8524f69636fe7cba2cdd..57ecf51ff40efc2764cb52bbc213859a4fb6625a 100644 (file)
@@ -442,6 +442,10 @@ def FuncOneArgRetNumber(arg: number): number
   return arg
 enddef
 
+def FuncTwoArgNoRet(one: bool, two: number)
+  funcResult = two
+enddef
+
 def FuncOneArgRetString(arg: string): string
   return arg
 enddef
@@ -511,6 +515,14 @@ def Test_func_type_fails()
   CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
   CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1013: type mismatch, expected func() but got func(number)')
   CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1013: type mismatch, expected func() but got func(number): number')
+  CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(bool) but got func(bool, number)')
+  CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(?bool) but got func(bool, number)')
+  CheckDefFailure(['let Ref1: func(...bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(...bool) but got func(bool, number)')
+
+  call CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
+  call CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
+  call CheckDefFailure(['let RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E740:')
+  call CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')
 enddef
 
 def Test_func_return_type()
index 22b00e4dcf9d7380b7358ce10f2e03e555024747..d7d504b3b2c1aa4e1f8eb733904fc2a4ac318861 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    548,
 /**/
     547,
 /**/
index 0d245d2ea3179c4d329de9607528288fcf3385b0..33c4a6cdf5bfc579edac3a7a9957d5d817dd36ee 100644 (file)
@@ -1648,7 +1648,10 @@ parse_type(char_u **arg, garray_T *type_gap)
                        {
                            ++p;
                            if (!VIM_ISWHITE(*p))
+                           {
                                semsg(_(e_white_after), ",");
+                               return &t_any;
+                           }
                        }
                        p = skipwhite(p);
                        if (argcount == MAX_FUNC_ARGS)
@@ -1675,7 +1678,7 @@ parse_type(char_u **arg, garray_T *type_gap)
                    *arg = skipwhite(*arg);
                    ret_type = parse_type(arg, type_gap);
                }
-               if (flags == 0 && first_optional == -1)
+               if (flags == 0 && first_optional == -1 && argcount <= 0)
                    type = get_func_type(ret_type, argcount, type_gap);
                else
                {
@@ -1822,8 +1825,9 @@ vartype_name(vartype_T type)
        case VAR_CHANNEL: return "channel";
        case VAR_LIST: return "list";
        case VAR_DICT: return "dict";
-       case VAR_FUNC: return "func";
-       case VAR_PARTIAL: return "partial";
+
+       case VAR_FUNC:
+       case VAR_PARTIAL: return "func";
     }
     return "unknown";
 }
@@ -1853,7 +1857,7 @@ type_name(type_T *type, char **tofree)
            return *tofree;
        }
     }
-    if (type->tt_type == VAR_FUNC || type->tt_type == VAR_PARTIAL)
+    if (type->tt_type == VAR_FUNC)
     {
        garray_T    ga;
        int         i;
@@ -1866,12 +1870,16 @@ type_name(type_T *type, char **tofree)
        STRCPY(ga.ga_data, "func(");
        ga.ga_len += 5;
 
-       for (i = 0; i < type->tt_argcount + varargs; ++i)
+       for (i = 0; i < type->tt_argcount; ++i)
        {
            char *arg_free;
-           char *arg_type = type_name(type->tt_args[i], &arg_free);
+           char *arg_type;
            int  len;
 
+           if (type->tt_args == NULL)
+               arg_type = "[unknown]";
+           else
+               arg_type = type_name(type->tt_args[i], &arg_free);
            if (i > 0)
            {
                STRCPY((char *)ga.ga_data + ga.ga_len, ", ");
@@ -1884,7 +1892,7 @@ type_name(type_T *type, char **tofree)
                return "[unknown]";
            }
            *tofree = ga.ga_data;
-           if (i == type->tt_argcount)
+           if (varargs && i == type->tt_argcount - 1)
            {
                STRCPY((char *)ga.ga_data + ga.ga_len, "...");
                ga.ga_len += 3;
@@ -4007,8 +4015,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
        }
 
        // new local variable
-       if ((type->tt_type == VAR_FUNC || type->tt_type == VAR_PARTIAL)
-                                           && var_check_func_name(name, TRUE))
+       if (type->tt_type == VAR_FUNC && var_check_func_name(name, TRUE))
            goto theend;
        idx = reserve_local(cctx, arg, varlen, cmdidx == CMD_const, type);
        if (idx < 0)