From 01865ade85d2508639e24aaca5948b09fb284a82 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 26 Jul 2020 18:33:09 +0200 Subject: 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 #6507) --- src/testdir/test_vim9_func.vim | 22 ++++++++++++++++++++++ src/version.c | 2 ++ src/vim9compile.c | 10 +++++----- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 0d39d5764..c05e98e70 100644 --- 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 index 248143440..e969ab0f3 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1302, /**/ 1301, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 31e761284..8efb1f672 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2106,16 +2106,16 @@ parse_type(char_u **arg, garray_T *type_gap) first_optional = argcount; ++p; } - 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; } + else if (first_optional != -1) + { + emsg(_("E1007: mandatory argument after optional argument")); + return &t_any; + } arg_type[argcount++] = parse_type(&p, type_gap); -- cgit v1.2.1