changeset 25032:123590c942b7 v8.2.3053

patch 8.2.3053: Vim9: cannot assign to @@ in :def function Commit: https://github.com/vim/vim/commit/13e45d14ba7f590fb243c041bc45e6d4d47c8432 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jun 26 13:28:35 2021 +0200 patch 8.2.3053: Vim9: cannot assign to @@ in :def function Problem: Vim9: cannot assign to @@ in :def function Solution: Handle '@' like '"'.
author Bram Moolenaar <Bram@vim.org>
date Sat, 26 Jun 2021 13:30:04 +0200
parents e52b5b8cfee4
children 6f903a90a037
files src/testdir/test_vim9_assign.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 19 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -228,16 +228,6 @@ def Test_assignment()
   CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
   CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
 
-  lines =<< trim END
-    @c = 'areg'
-    @c ..= 'add'
-    assert_equal('aregadd', @c)
-  END
-  CheckDefAndScriptSuccess(lines)
-
-  CheckDefFailure(['@a += "more"'], 'E1051:')
-  CheckDefFailure(['@a += 123'], 'E1012:')
-
   v:errmsg = 'none'
   v:errmsg ..= 'again'
   assert_equal('noneagain', v:errmsg)
@@ -249,6 +239,21 @@ def Test_assignment()
   END
 enddef
 
+def Test_assign_register()
+  var lines =<< trim END
+    @c = 'areg'
+    @c ..= 'add'
+    assert_equal('aregadd', @c)
+
+    @@ = 'some text'
+    assert_equal('some text', getreg('"'))
+  END
+  CheckDefAndScriptSuccess(lines)
+
+  CheckDefFailure(['@a += "more"'], 'E1051:')
+  CheckDefFailure(['@a += 123'], 'E1012:')
+enddef
+
 def Test_reserved_name()
   for name in ['true', 'false', 'null']
     CheckDefExecAndScriptFailure(['var ' .. name .. ' =  0'], 'E1034:')
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3053,
+/**/
     3052,
 /**/
     3051,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -5854,7 +5854,8 @@ get_var_dest(
     }
     else if (*name == '@')
     {
-	if (!valid_yank_reg(name[1], FALSE) || name[1] == '.')
+	if (name[1] != '@'
+			&& (!valid_yank_reg(name[1], FALSE) || name[1] == '.'))
 	{
 	    emsg_invreg(name[1]);
 	    return FAIL;