# HG changeset patch # User Bram Moolenaar # Date 1622910603 -7200 # Node ID 0bc60e26a2b5fc7f040906a1f896aaf9d0962461 # Parent e651d1ef23b578a3627927a6495daf4d49e6c40a patch 8.2.2942: Vim9: error when calling function with too few arguments Commit: https://github.com/vim/vim/commit/8da6d6db340069b3307e6bce3cdd40441197efce Author: Bram Moolenaar Date: Sat Jun 5 18:15:09 2021 +0200 patch 8.2.2942: Vim9: error when calling function with too few arguments Problem: Vim9: internal error when calling function with too few arguments Solution: Check for argument count to be too few. (closes https://github.com/vim/vim/issues/8325) diff --git a/src/errors.h b/src/errors.h --- a/src/errors.h +++ b/src/errors.h @@ -419,3 +419,7 @@ EXTERN char e_cannot_open_terminal_from_ INIT(= N_("E1188: Cannot open a terminal from the command line window")); EXTERN char e_cannot_use_legacy_with_command_str[] INIT(= N_("E1189: Cannot use :legacy with this command: %s")); +EXTERN char e_one_argument_too_few[] + INIT(= N_("E1190: One argument too few")); +EXTERN char e_nr_arguments_too_few[] + INIT(= N_("E1190: %d arguments too few")); diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -810,6 +810,15 @@ def Test_map_function_arg() assert_equal(['0:a', '1:b', '2:c'], l) END CheckDefAndScriptSuccess(lines) + + lines =<< trim END + range(3)->map((a, b, c) => a + b + c) + END + CheckDefExecAndScriptFailure(lines, 'E1190: One argument too few') + lines =<< trim END + range(3)->map((a, b, c, d) => a + b + c + d) + END + CheckDefExecAndScriptFailure(lines, 'E1190: 2 arguments too few') enddef def Test_map_item_type() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2942, +/**/ 2941, /**/ 2940, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -4234,6 +4234,14 @@ call_def_function( semsg(_(e_nr_arguments_too_many), idx); goto failed_early; } + else if (idx < 0) + { + if (idx == -1) + emsg(_(e_one_argument_too_few)); + else + semsg(_(e_nr_arguments_too_few), -idx); + goto failed_early; + } // Put arguments on the stack, but no more than what the function expects. // A lambda can be called with more arguments than it uses.