summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-12-16 14:46:40 +0100
committerChristian Brabandt <cb@256bit.org>2023-12-16 14:46:40 +0100
commit062bb6b9099f4c92e10465e5ff98db092a3eac1b (patch)
tree984ddab37d0754341e011fb1d47444f579e11f72 /src
parenta185a31fc05c2dd15315cd59afc02b69aabb5893 (diff)
patch 9.0.2173: Vim9: crash when compiling for statement and non-existing typev9.0.2173
Problem: Vim9: Vim crashes when compiling a for statement with a non-existing type Solution: Error out when lhs_type is not null closes: #13703 Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_script.vim110
-rw-r--r--src/version.c2
-rw-r--r--src/vim9cmds.c2
3 files changed, 114 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 2aca20ad8d..7ae4d553e3 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -2698,6 +2698,37 @@ def Test_for_loop_fails()
v9.CheckDefSuccess(lines)
v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
+
+ # Test for too many for loops
+ lines =<< trim END
+ vim9script
+ def Foo()
+ for a in range(1)
+ for b in range(1)
+ for c in range(1)
+ for d in range(1)
+ for e in range(1)
+ for f in range(1)
+ for g in range(1)
+ for h in range(1)
+ for i in range(1)
+ for j in range(1)
+ for k in range(1)
+ endfor
+ endfor
+ endfor
+ endfor
+ endfor
+ endfor
+ endfor
+ endfor
+ endfor
+ endfor
+ endfor
+ enddef
+ defcompile
+ END
+ v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
enddef
def Test_for_loop_script_var()
@@ -4796,6 +4827,85 @@ def Test_defer_skipped()
v9.CheckSourceSuccess(lines)
enddef
+" Test for using defer without parenthesis for the function name
+def Test_defer_func_without_paren()
+ var lines =<< trim END
+ vim9script
+ def Foo()
+ defer Bar
+ enddef
+ defcompile
+ END
+ v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
+enddef
+
+" Test for using defer without parenthesis for the function name
+def Test_defer_non_existing_func()
+ var lines =<< trim END
+ vim9script
+ def Foo()
+ defer Bar()
+ enddef
+ defcompile
+ END
+ v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
+enddef
+
+" Test for using defer with an invalid function name
+def Test_defer_invalid_func()
+ var lines =<< trim END
+ vim9script
+ def Foo()
+ var Abc = 10
+ defer Abc()
+ enddef
+ defcompile
+ END
+ v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
+enddef
+
+" Test for using defer with an invalid argument to a function
+def Test_defer_invalid_func_arg()
+ var lines =<< trim END
+ vim9script
+ def Bar(x: number)
+ enddef
+ def Foo()
+ defer Bar(a)
+ enddef
+ defcompile
+ END
+ v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
+enddef
+
+" Test for using an non-existing type in a "for" statement.
+def Test_invalid_type_in_for()
+ var lines =<< trim END
+ vim9script
+ def Foo()
+ for b: x in range(10)
+ endfor
+ enddef
+ defcompile
+ END
+ v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x in range(10)', 1)
+enddef
+
+" Test for using a line break between the variable name and the type in a for
+" statement.
+def Test_for_stmt_space_before_type()
+ var lines =<< trim END
+ vim9script
+ def Foo()
+ for a
+ :number in range(10)
+ endfor
+ enddef
+ defcompile
+ END
+ v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
+enddef
+
" Keep this last, it messes up highlighting.
def Test_substitute_cmd()
new
diff --git a/src/version.c b/src/version.c
index 213a0e7c21..779e116965 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 */
/**/
+ 2173,
+/**/
2172,
/**/
2170,
diff --git a/src/vim9cmds.c b/src/vim9cmds.c
index 07e6501a9b..a276d53237 100644
--- a/src/vim9cmds.c
+++ b/src/vim9cmds.c
@@ -1088,6 +1088,8 @@ compile_for(char_u *arg_start, cctx_T *cctx)
}
p = skipwhite(p + 1);
lhs_type = parse_type(&p, cctx->ctx_type_list, TRUE);
+ if (lhs_type == NULL)
+ goto failed;
}
if (get_var_dest(name, &dest, CMD_for, &opt_flags,