]> granicus.if.org Git - vim/commitdiff
patch 8.2.1357: Vim9: cannot assign to / register v8.2.1357
authorBram Moolenaar <Bram@vim.org>
Sun, 2 Aug 2020 16:58:54 +0000 (18:58 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 2 Aug 2020 16:58:54 +0000 (18:58 +0200)
Problem:    Vim9: cannot assign to / register.
Solution:   Adjust check for assignment.

src/testdir/test_vim9_expr.vim
src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index ef8797f8f8fe658556aafd894e4f0e89cb69673f..584126ff1e7a9ae28f469b47c01ddf666365c51e 100644 (file)
@@ -1439,6 +1439,13 @@ def Test_expr7_register()
 
   normal axyz
   assert_equal("xyz", @.)
+  call CheckDefFailure(["@. = 'yes'"], 'E354:')
+
+  @/ = 'slash'
+  assert_equal('slash', @/)
+
+  @= = 'equal'
+  assert_equal('equal', @=)
 enddef
 
 def Test_expr7_namespace()
index 5ed9a3d420ee33a62b0a3e8a5034c35e79d6185c..5c2db2ef4219192fd3b69692e69feeeccd609cd3 100644 (file)
@@ -470,8 +470,9 @@ def Test_assignment_failure()
   call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
   call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
 
-  call CheckDefFailure(['let @~ = 5'], 'E354:')
+  call CheckDefFailure(['let @~ = 5'], 'E1066:')
   call CheckDefFailure(['let @a = 5'], 'E1066:')
+  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
   call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
 
   call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
index b04f4feb8d3b7ebd5b6d4f6369f399937803bf3e..a9059792da34d1427e9b8bd0e2f8a9007e401879 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1357,
 /**/
     1356,
 /**/
index cfd4ff19060e064cba0f85fe1821249f17de11a1..24ef87931b83a1999b604f6f11c9844fceb4be1b 100644 (file)
@@ -5214,9 +5214,14 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
        int             has_index = FALSE;
        int             instr_count = -1;
 
-       p = (*var_start == '&' || *var_start == '$'
-                            || *var_start == '@') ? var_start + 1 : var_start;
-       p = to_name_end(p, TRUE);
+       if (*var_start == '@')
+           p = var_start + 2;
+       else
+       {
+           p = (*var_start == '&' || *var_start == '$')
+                                                  ? var_start + 1 : var_start;
+           p = to_name_end(p, TRUE);
+       }
 
        // "a: type" is declaring variable "a" with a type, not "a:".
        if (is_decl && var_end == var_start + 2 && var_end[-1] == ':')
@@ -5279,7 +5284,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
            }
            else if (*var_start == '@')
            {
-               if (!valid_yank_reg(var_start[1], TRUE))
+               if (!valid_yank_reg(var_start[1], FALSE) || var_start[1] == '.')
                {
                    emsg_invreg(var_start[1]);
                    goto theend;
@@ -7247,7 +7252,10 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
                int     oplen;
                int     heredoc;
 
-               var_end = find_name_end(pskip, NULL, NULL,
+               if (ea.cmd[0] == '@')
+                   var_end = ea.cmd + 2;
+               else
+                   var_end = find_name_end(pskip, NULL, NULL,
                                                FNE_CHECK_START | FNE_INCL_BR);
                oplen = assignment_len(skipwhite(var_end), &heredoc);
                if (oplen > 0)