]> granicus.if.org Git - vim/commitdiff
patch 8.2.1534: Vim9: type error for argument type is not at call position v8.2.1534
authorBram Moolenaar <Bram@vim.org>
Fri, 28 Aug 2020 15:19:07 +0000 (17:19 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 28 Aug 2020 15:19:07 +0000 (17:19 +0200)
Problem:    Vim9: type error for argument type is not at call position.
Solution:   Set the context and stack after checking the arguments.
            (issue #6785)

src/testdir/test_vim9_func.vim
src/userfunc.c
src/version.c
src/vim9execute.c

index 2c23a0e16e4c8d967c471f9e84be82addeedf46e..39382f3f7c71be4cb759b3b781e19d2abcb9d692 100644 (file)
@@ -223,6 +223,15 @@ def Test_call_wrong_args()
   call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
   call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
   call CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
+
+  let lines =<< trim END
+    vim9script
+    def Func(s: string)
+      echo s
+    enddef
+    Func([])
+  END
+  call CheckScriptFailure(lines, 'E1012: type mismatch, expected string but got list<unknown>', 5)
 enddef
 
 " Default arg and varargs
index f3c04b28af3d2f53a2c5ddc60a5e2e03dd32a1d1..be706bdbbde1d2b522ea712d765ce9d0f02b977e 100644 (file)
@@ -1314,17 +1314,10 @@ call_user_func(
 
     if (fp->uf_def_status != UF_NOT_COMPILED)
     {
-       estack_push_ufunc(fp, 1);
-       save_current_sctx = current_sctx;
-       current_sctx = fp->uf_script_ctx;
-
        // Execute the function, possibly compiling it first.
        call_def_function(fp, argcount, argvars, funcexe->partial, rettv);
        --depth;
        current_funccal = fc->caller;
-
-       estack_pop();
-       current_sctx = save_current_sctx;
        free_funccal(fc);
        return;
     }
index e6299f413f57249dc37e1ff6e7a888524f5370e4..21c6a18f2643b7632f0e114220e42201d00e9b0b 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1534,
 /**/
     1533,
 /**/
index 53a748e971b993b2213f069bfd0803779ea60fd0..05cf5da6fbda82ddfed43dbf8048fda2e813bc4f 100644 (file)
@@ -726,7 +726,7 @@ call_def_function(
     int                idx;
     int                ret = FAIL;
     int                defcount = ufunc->uf_args.ga_len - argc;
-    int                save_sc_version = current_sctx.sc_version;
+    sctx_T     save_current_sctx = current_sctx;
     int                breakcheck_count = 0;
     int                called_emsg_before = called_emsg;
 
@@ -867,7 +867,10 @@ call_def_function(
        ectx.ec_instr = dfunc->df_instr;
     }
 
+    // Following errors are in the function, not the caller.
     // Commands behave like vim9script.
+    estack_push_ufunc(ufunc, 1);
+    current_sctx = ufunc->uf_script_ctx;
     current_sctx.sc_version = SCRIPT_VERSION_VIM9;
 
     // Decide where to start execution, handles optional arguments.
@@ -2614,9 +2617,11 @@ failed:
     // When failed need to unwind the call stack.
     while (ectx.ec_frame_idx != initial_frame_idx)
        func_return(&ectx);
-failed_early:
-    current_sctx.sc_version = save_sc_version;
 
+    estack_pop();
+    current_sctx = save_current_sctx;
+
+failed_early:
     // Free all local variables, but not arguments.
     for (idx = 0; idx < ectx.ec_stack.ga_len; ++idx)
        clear_tv(STACK_TV(idx));