diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-07-21 20:55:50 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-07-21 20:55:50 +0200 |
commit | c7db57788b661a5da0b375d4fffdf10721550141 (patch) | |
tree | d4094585b9118ba15554f69bf148cfaa9e9cb2ad | |
parent | 7591116acffc45b5880c49244646651badac1629 (diff) | |
download | vim-git-c7db57788b661a5da0b375d4fffdf10721550141.tar.gz |
patch 8.2.1261: Vim9: common type of function not testedv8.2.1261
Problem: Vim9: common type of function not tested.
Solution: Add a test. Fix uncovered problems.
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 21 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 8 | ||||
-rw-r--r-- | src/vim9execute.c | 1 |
4 files changed, 29 insertions, 3 deletions
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index b68eb3e4a..4c9db5cf6 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 @@ 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 index 8df135925..a779d54bd 100644 --- 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 index ce24dd6a5..0e3e01ac7 100644 --- 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 *eap, cmdidx_T cmdidx, cctx_T *cctx) 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 f022b5ba8..d83ac5a30 100644 --- 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) |