patch 8.2.1261: Vim9: common type of function not tested
Problem: Vim9: common type of function not tested.
Solution: Add a test. Fix uncovered problems.
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index b68eb3e..4c9db5c 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -3,6 +3,15 @@
source check.vim
source vim9.vim
+
+let g:cond = v:false
+def FuncOne(arg: number): string
+ return 'yes'
+enddef
+def FuncTwo(arg: number): number
+ return 123
+enddef
+
" test cond ? expr : expr
def Test_expr1()
assert_equal('one', true ? 'one' : 'two')
@@ -43,6 +52,11 @@
let RetTwo: func(string): number = function('winnr')
let RetThat: func = g:atrue ? RetOne : RetTwo
assert_equal(function('len'), RetThat)
+
+ let x = FuncOne
+ let y = FuncTwo
+ let Z = g:cond ? FuncOne : FuncTwo
+ assert_equal(123, Z(3))
enddef
def Test_expr1_vimscript()
@@ -88,6 +102,13 @@
call CheckDefFailure(["let x = 1 ? 'one': 'two'"], msg)
call CheckDefFailure(["let x = 1 ? 'one' :'two'"], msg)
call CheckDefFailure(["let x = 1 ? 'one':'two'"], msg)
+
+ " missing argument detected even when common type is used
+ call CheckDefFailure([
+ \ 'let x = FuncOne',
+ \ 'let y = FuncTwo',
+ \ 'let Z = g:cond ? FuncOne : FuncTwo',
+ \ 'Z()'], 'E119:')
endfunc
" TODO: define inside test function
diff --git a/src/version.c b/src/version.c
index 8df1359..a779d54 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1261,
+/**/
1260,
/**/
1259,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index ce24dd6..0e3e01a 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -1143,13 +1143,13 @@
RETURN_OK_IF_SKIP(cctx);
- if (type->tt_type == VAR_LIST)
- item_type = type->tt_member;
- else if (type->tt_type != VAR_ANY)
+ if (type->tt_type != VAR_LIST)
{
+ // cannot happen, caller has checked the type
emsg(_(e_listreq));
return FAIL;
}
+ item_type = type->tt_member;
if ((isn = generate_instr(cctx, ISN_GETITEM)) == NULL)
return FAIL;
isn->isn_arg.number = index;
@@ -4969,6 +4969,8 @@
if (var_count > 0 && is_decl)
{
+ // TODO: should we allow this, and figure out type inference from list
+ // members?
emsg(_("E1092: Cannot use a list for a declaration"));
return NULL;
}
diff --git a/src/vim9execute.c b/src/vim9execute.c
index f022b5b..d83ac5a 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -2470,6 +2470,7 @@
if (func_return(&ectx) == FAIL)
// only fails when out of memory
goto failed;
+ continue;
on_error:
if (trylevel == 0)