patch 9.0.2157: Vim9: incorrectly parses :def func definitions
Problem: Vim9: incorrectly parses :def func definitions
Solution: check for more context when parsing function args
Signed-off-by: Christian Brabandt <cb@256bit.org>
Incorrectly parses def function definitions
Vim currently allows to define the following vim9 function:
def Func(f=
)
enddef
It currently thinks a Lambda is following the `=` but it doesn't check,
that there is actually an expression following. So when such a think is
encountered, remember that an expression should be following.
If no expression is coming in the next few lines, fail parsing the
function arguments, which will Vim no longer accept such a function.
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 47b23e8..27585a9 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
Binary files differ
diff --git a/src/userfunc.c b/src/userfunc.c
index 33e73a9..e2b1bc3 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -243,6 +243,7 @@
int c;
int any_default = FALSE;
char_u *whitep = *argp;
+ int need_expr = FALSE;
if (newargs != NULL)
ga_init2(newargs, sizeof(char_u *), 3);
@@ -282,7 +283,7 @@
semsg(_(e_invalid_argument_str), *argp);
goto err_ret;
}
- if (*p == endchar)
+ if (*p == endchar && !need_expr)
break;
if (p[0] == '.' && p[1] == '.' && p[2] == '.')
@@ -435,6 +436,8 @@
if (ga_grow(default_args, 1) == FAIL)
goto err_ret;
+ if (need_expr)
+ need_expr = FALSE;
// trim trailing whitespace
while (p > expr && VIM_ISWHITE(p[-1]))
p--;
@@ -453,7 +456,11 @@
}
}
else
+ {
mustend = TRUE;
+ if (*skipwhite(p) == NUL)
+ need_expr = TRUE;
+ }
}
else if (any_default)
{
diff --git a/src/version.c b/src/version.c
index f7d6cbc..919f42f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2157,
+/**/
2156,
/**/
2155,