changeset 21969:ba2415df82d7 v8.2.1534

patch 8.2.1534: Vim9: type error for argument type is not at call position Commit: https://github.com/vim/vim/commit/ee8580e52e767916e2a95e8ac0732fd8a5ae0651 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Aug 28 17:19:07 2020 +0200 patch 8.2.1534: Vim9: type error for argument type is not at call position Problem: Vim9: type error for argument type is not at call position. Solution: Set the context and stack after checking the arguments. (issue #6785)
author Bram Moolenaar <Bram@vim.org>
date Fri, 28 Aug 2020 17:30:04 +0200
parents 613ecf205d6a
children 7c76b6dbc14d
files src/testdir/test_vim9_func.vim src/userfunc.c src/version.c src/vim9execute.c
diffstat 4 files changed, 19 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -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
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -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;
     }
--- 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 */
 /**/
+    1534,
+/**/
     1533,
 /**/
     1532,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -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);
+
+    estack_pop();
+    current_sctx = save_current_sctx;
+
 failed_early:
-    current_sctx.sc_version = save_sc_version;
-
     // Free all local variables, but not arguments.
     for (idx = 0; idx < ectx.ec_stack.ga_len; ++idx)
 	clear_tv(STACK_TV(idx));