]> granicus.if.org Git - vim/commitdiff
patch 8.2.1261: Vim9: common type of function not tested v8.2.1261
authorBram Moolenaar <Bram@vim.org>
Tue, 21 Jul 2020 18:55:50 +0000 (20:55 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 21 Jul 2020 18:55:50 +0000 (20:55 +0200)
Problem:    Vim9: common type of function not tested.
Solution:   Add a test.  Fix uncovered problems.

src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c
src/vim9execute.c

index b68eb3e4a2029d91c867b1bd457df7479a89b94c..4c9db5cf6303bea2edf47a8e99b63fa48265de00 100644 (file)
@@ -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
index 8df1359255cd6c2dd76864c6fa1244a8cbfb732a..a779d54bda0a28de603574a44f9f6344f38fa04b 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1261,
 /**/
     1260,
 /**/
index ce24dd6a56e6cec4b5835a255badbd3f9e8728bd..0e3e01ac73a03b019ead429816f04238be3b602d 100644 (file)
@@ -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;
     }
index f022b5ba854ca3c45f247adf44dac7126964d620..d83ac5a301e295b4a8029e906863bdafab48a4aa 100644 (file)
@@ -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)