summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Brabandt <cb@256bit.org>2023-12-08 20:57:38 +0100
committerChristian Brabandt <cb@256bit.org>2023-12-11 17:50:08 +0100
commite4a450a87ba532cbfe1c4e97cac378eaafc3ae39 (patch)
tree9484dfdb32cba5112d6af8868e34066c1dd6ec29
parent9ed53752df1020a6881ac68d1bde2852c9a680aa (diff)
patch 9.0.2157: Vim9: incorrectly parses :def func definitionsv9.0.2157
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>
-rw-r--r--src/testdir/test_vim9_func.vim7
-rw-r--r--src/userfunc.c9
-rw-r--r--src/version.c2
3 files changed, 17 insertions, 1 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 47b23e85e5..27585a9049 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -862,6 +862,13 @@ def Test_func_with_comments()
v9.CheckScriptFailure(lines, 'E125:', 1)
lines =<< trim END
+ def Func(f=
+ )
+ enddef
+ END
+ v9.CheckScriptFailure(lines, 'E125:', 2)
+
+ lines =<< trim END
def Func(
arg: string# comment
)
diff --git a/src/userfunc.c b/src/userfunc.c
index 33e73a9a52..e2b1bc3226 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -243,6 +243,7 @@ get_function_args(
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 @@ get_function_args(
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 @@ get_function_args(
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 @@ get_function_args(
}
}
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 f7d6cbcb6b..919f42f2d3 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2157,
+/**/
2156,
/**/
2155,