# HG changeset patch # User Bram Moolenaar # Date 1595358006 -7200 # Node ID 0f0fee4122d3880ddb37b3c51fa21d26bb0af3b0 # Parent 2df8f745a6228be208b1c419532b6ccb6a563ccd patch 8.2.1261: Vim9: common type of function not tested Commit: https://github.com/vim/vim/commit/c7db57788b661a5da0b375d4fffdf10721550141 Author: Bram Moolenaar Date: Tue Jul 21 20:55:50 2020 +0200 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 --- 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 @@ def Test_expr1() 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 @@ func Test_expr1_fails() 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 --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1261, +/**/ 1260, /**/ 1259, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1143,13 +1143,13 @@ generate_GETITEM(cctx_T *cctx, int index 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 @@ compile_assignment(char_u *arg, exarg_T 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 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2470,6 +2470,7 @@ func_return: if (func_return(&ectx) == FAIL) // only fails when out of memory goto failed; + continue; on_error: if (trylevel == 0)