# HG changeset patch # User Bram Moolenaar # Date 1595781906 -7200 # Node ID e87a97868bbc7e6f5ead368cb70d50a3874e4759 # Parent e10b92dd259fadce3f2fd1eeb99708c2973bc9e2 patch 8.2.1302: Vim9: varargs arg after optional arg does not work Commit: https://github.com/vim/vim/commit/01865ade85d2508639e24aaca5948b09fb284a82 Author: Bram Moolenaar Date: Sun Jul 26 18:33:09 2020 +0200 patch 8.2.1302: Vim9: varargs arg after optional arg does not work Problem: Vim9: varargs arg after optional arg does not work Solution: Check for the "..." first. (issue https://github.com/vim/vim/issues/6507) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -376,6 +376,28 @@ def Test_call_funcref() assert_equal([1, 2, 3], g:echo) END CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + def OptAndVar(nr: number, opt = 12, ...l: list): number + g:optarg = opt + g:listarg = l + return nr + enddef + let Funcref: func(number, ?number, ...list): number = function('OptAndVar') + assert_equal(10, Funcref(10)) + assert_equal(12, g:optarg) + assert_equal([], g:listarg) + + assert_equal(11, Funcref(11, 22)) + assert_equal(22, g:optarg) + assert_equal([], g:listarg) + + assert_equal(17, Funcref(17, 18, 1, 2, 3)) + assert_equal(18, g:optarg) + assert_equal([1, 2, 3], g:listarg) + END + CheckScriptSuccess(lines) enddef let SomeFunc = function('len') diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1302, +/**/ 1301, /**/ 1300, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2106,16 +2106,16 @@ parse_type(char_u **arg, garray_T *type_ first_optional = argcount; ++p; } + else if (STRNCMP(p, "...", 3) == 0) + { + flags |= TTFLAG_VARARGS; + p += 3; + } else if (first_optional != -1) { emsg(_("E1007: mandatory argument after optional argument")); return &t_any; } - else if (STRNCMP(p, "...", 3) == 0) - { - flags |= TTFLAG_VARARGS; - p += 3; - } arg_type[argcount++] = parse_type(&p, type_gap);