summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorErnie Rael <errael@raelity.com>2023-10-21 11:45:38 +0200
committerChristian Brabandt <cb@256bit.org>2023-10-21 11:45:38 +0200
commit3ec6c1fe3bb1b366b710d3e7226f7eed3be1801a (patch)
treedb19fb62d95aae1ff003d0a5750cdf342c3d6340 /src
parentd3e277f279ed628809eb6857ea3ebcfca566ca2a (diff)
patch 9.0.2057: Vim9: no strict type checks for funcrefs varargsv9.0.2057
Problem: Vim9: no strict type checks for funcrefs varargs Solution: Perform strict type checking when declaring funcrefs with vararg declaration, add tests closes: #13397 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Ernie Rael <errael@raelity.com>
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_assign.vim6
-rw-r--r--src/testdir/test_vim9_func.vim4
-rw-r--r--src/version.c2
-rw-r--r--src/vim9type.c9
4 files changed, 16 insertions, 5 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index bff9c9f8f1..6d2858f6c0 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1890,7 +1890,7 @@ def Test_assign_funcref_args()
var FuncAnyVA: func(...any): number
FuncAnyVA = (v): number => v
END
- v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(...any): number but got func(any): number')
+ v9.CheckScriptFailure(lines, 'E1180: Variable arguments type must be a list: any')
# varargs must match
lines =<< trim END
@@ -1898,7 +1898,7 @@ def Test_assign_funcref_args()
var FuncAnyVA: func(...any): number
FuncAnyVA = (v1, v2): number => v1 + v2
END
- v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(...any): number but got func(any, any): number')
+ v9.CheckScriptFailure(lines, 'E1180: Variable arguments type must be a list: any')
# varargs must match
lines =<< trim END
@@ -1906,7 +1906,7 @@ def Test_assign_funcref_args()
var FuncAnyVA: func(...any): number
FuncAnyVA = (v1: list<any>): number => 3
END
- v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(...any): number but got func(list<any>): number')
+ v9.CheckScriptFailure(lines, 'E1180: Variable arguments type must be a list: any')
enddef
def Test_assign_funcref_arg_any()
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 701a2f085d..cbbd572640 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -1995,7 +1995,7 @@ def Test_varargs_mismatch()
var res = Map((v) => str2nr(v))
assert_equal(12, res)
END
- v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected func(...any): number but got func(any): number')
+ v9.CheckScriptFailure(lines, 'E1180: Variable arguments type must be a list: any')
enddef
def Test_using_var_as_arg()
@@ -2764,7 +2764,7 @@ def Test_func_type_fails()
v9.CheckDefFailure(['var Ref1: func()', 'Ref1 = g:FuncOneArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(number): number')
v9.CheckDefFailure(['var Ref1: func(bool)', 'Ref1 = g:FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(bool) but got func(bool, number)')
v9.CheckDefFailure(['var Ref1: func(?bool)', 'Ref1 = g:FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(?bool) but got func(bool, number)')
- v9.CheckDefFailure(['var Ref1: func(...bool)', 'Ref1 = g:FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(...bool) but got func(bool, number)')
+ v9.CheckDefFailure(['var Ref1: func(...bool)', 'Ref1 = g:FuncTwoArgNoRet'], 'E1180: Variable arguments type must be a list: bool')
v9.CheckDefFailure(['var RefWrong: func(string ,number)'], 'E1068:')
v9.CheckDefFailure(['var RefWrong: func(string,number)'], 'E1069:')
diff --git a/src/version.c b/src/version.c
index 7584e45fff..fbf2999dd3 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2057,
+/**/
2056,
/**/
2055,
diff --git a/src/vim9type.c b/src/vim9type.c
index 6a5848792b..c31e51b983 100644
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -1231,6 +1231,15 @@ parse_type(char_u **arg, garray_T *type_gap, int give_error)
type = parse_type(&p, type_gap, give_error);
if (type == NULL)
return NULL;
+ if ((flags & TTFLAG_VARARGS) != 0
+ && type->tt_type != VAR_LIST)
+ {
+ char *tofree;
+ semsg(_(e_variable_arguments_type_must_be_list_str),
+ type_name(type, &tofree));
+ vim_free(tofree);
+ return NULL;
+ }
arg_type[argcount++] = type;
// Nothing comes after "...{type}".