diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2023-12-16 14:46:40 +0100 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-12-16 14:46:40 +0100 |
commit | 062bb6b9099f4c92e10465e5ff98db092a3eac1b (patch) | |
tree | 984ddab37d0754341e011fb1d47444f579e11f72 /src | |
parent | a185a31fc05c2dd15315cd59afc02b69aabb5893 (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.vim | 110 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9cmds.c | 2 |
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, |