Mercurial > vim
changeset 21504:e87a97868bbc v8.2.1302
patch 8.2.1302: Vim9: varargs arg after optional arg does not work
Commit: https://github.com/vim/vim/commit/01865ade85d2508639e24aaca5948b09fb284a82
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 26 Jul 2020 18:45:06 +0200 |
parents | e10b92dd259f |
children | fbade715de74 |
files | src/testdir/test_vim9_func.vim src/version.c src/vim9compile.c |
diffstat | 3 files changed, 29 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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>): number + g:optarg = opt + g:listarg = l + return nr + enddef + let Funcref: func(number, ?number, ...list<number>): 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')
--- 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,
--- 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);