changeset 21345:5dd4cbc1e9e6 v8.2.1223

patch 8.2.1223: Vim9: invalid type error for function default value Commit: https://github.com/vim/vim/commit/e30f64b4b551bb00318dc09c2f13ecd3d711119a Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jul 15 19:48:20 2020 +0200 patch 8.2.1223: Vim9: invalid type error for function default value Problem: Vim9: invalid type error for function default value. Solution: Use right argument index. (closes https://github.com/vim/vim/issues/6458)
author Bram Moolenaar <Bram@vim.org>
date Wed, 15 Jul 2020 20:00:04 +0200
parents f70c4c3c13ce
children ec94b49cdca6
files src/testdir/test_vim9_func.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 11 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -104,11 +104,19 @@ def MyDefaultArgs(name = 'string'): stri
   return name
 enddef
 
+def MyDefaultSecond(name: string, second: bool  = true): string
+  return second ? name : 'none'
+enddef
+
 def Test_call_default_args()
   assert_equal('string', MyDefaultArgs())
   assert_equal('one', MyDefaultArgs('one'))
   assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
 
+  assert_equal('test', MyDefaultSecond('test'))
+  assert_equal('test', MyDefaultSecond('test', true))
+  assert_equal('none', MyDefaultSecond('test', false))
+
   CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef', 'defcompile'], 'E1001:')
   CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: argument 1: type mismatch, expected number but got string')
 enddef
--- 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 */
 /**/
+    1223,
+/**/
     1222,
 /**/
     1221,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -6865,7 +6865,7 @@ compile_def_function(ufunc_T *ufunc, int
 	    val_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
 	    if (ufunc->uf_arg_types[arg_idx] == &t_unknown)
 		ufunc->uf_arg_types[arg_idx] = val_type;
-	    else if (check_type(ufunc->uf_arg_types[i], val_type, FALSE)
+	    else if (check_type(ufunc->uf_arg_types[arg_idx], val_type, FALSE)
 								       == FAIL)
 	    {
 		arg_type_mismatch(ufunc->uf_arg_types[arg_idx], val_type,