]> granicus.if.org Git - vim/commitdiff
patch 8.2.2926: Vim9: no good error for using :legacy in a :def function v8.2.2926
authorBram Moolenaar <Bram@vim.org>
Wed, 2 Jun 2021 14:47:53 +0000 (16:47 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 2 Jun 2021 14:47:53 +0000 (16:47 +0200)
Problem:    Vim9: no good error for using :legacy in a :def function.
Solution:   Give an explicit error where :legacy is not working.
            (closes #8309)

src/errors.h
src/testdir/test_vim9_func.vim
src/version.c
src/vim9compile.c

index 00d395baea7d9f9954f81e39fb2b103ba85dfcd2..00e2d565d0a559e2a1f1b0524b89e3a47d01316b 100644 (file)
@@ -417,3 +417,5 @@ EXTERN char e_failed_to_source_defaults[]
        INIT(= N_("E1187: Failed to source defaults.vim"));
 EXTERN char e_cannot_open_terminal_from_command_line_window[]
        INIT(= N_("E1188: Cannot open a terminal from the command line window"));
+EXTERN char e_cannot_use_legacy_with_command_str[]
+       INIT(= N_("E1189: Cannot use :legacy with this command: %s"));
index 3626cca47a51cab93fa7bb4c5be0fb84d157b80b..9f0cd3f895f4ff0006f41ff2b34e397eb19b042f 100644 (file)
@@ -2207,6 +2207,15 @@ def Test_legacy_lambda()
   CheckScriptSuccess(lines)
 enddef
 
+def Test_legacy_errors()
+  for cmd in ['if', 'elseif', 'else', 'endif',
+              'for', 'endfor', 'continue', 'break',
+              'while', 'endwhile',
+              'try', 'catch', 'finally', 'endtry']
+    CheckDefFailure(['legacy ' .. cmd .. ' expr'], 'E1189:')
+  endfor
+enddef
+
 def DoFilterThis(a: string): list<string>
   # closure nested inside another closure using argument
   var Filter = (l) => filter(l, (_, v) => stridx(v, a) == 0)
index 188bb1a8802bfbafeaa4dc7957fedcb509cb821f..6761b72d8ed91c40f53269ff73e7434ca4ce8c1e 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2926,
 /**/
     2925,
 /**/
index 2ea487de78e0f2204ec7a311039dea17eb6da57a..5152b61a5f337c033167e782011360ab0aea50ca 100644 (file)
@@ -9222,6 +9222,27 @@ compile_def_function(
        {
            char_u *start = ea.cmd;
 
+           switch (ea.cmdidx)
+           {
+               case CMD_if:
+               case CMD_elseif:
+               case CMD_else:
+               case CMD_endif:
+               case CMD_for:
+               case CMD_endfor:
+               case CMD_continue:
+               case CMD_break:
+               case CMD_while:
+               case CMD_endwhile:
+               case CMD_try:
+               case CMD_catch:
+               case CMD_finally:
+               case CMD_endtry:
+                       semsg(_(e_cannot_use_legacy_with_command_str), ea.cmd);
+                       goto erret;
+               default: break;
+           }
+
            // ":legacy return expr" needs to be handled differently.
            if (checkforcmd(&start, "return", 4))
                ea.cmdidx = CMD_return;