changeset 21614:d0128ecd4341 v8.2.1357

patch 8.2.1357: Vim9: cannot assign to / register Commit: https://github.com/vim/vim/commit/658217276fccb5e53cdf4ba0f023bca80e0a8fed Author: Bram Moolenaar <Bram@vim.org> Date: Sun Aug 2 18:58:54 2020 +0200 patch 8.2.1357: Vim9: cannot assign to / register Problem: Vim9: cannot assign to / register. Solution: Adjust check for assignment.
author Bram Moolenaar <Bram@vim.org>
date Sun, 02 Aug 2020 19:00:03 +0200
parents 9dade08b2bad
children 38f947771cdf
files src/testdir/test_vim9_expr.vim src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c
diffstat 4 files changed, 24 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -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()
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -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:')
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1357,
+/**/
     1356,
 /**/
     1355,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -5214,9 +5214,14 @@ compile_assignment(char_u *arg, exarg_T 
 	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 
 	    }
 	    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
 		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)