]> granicus.if.org Git - vim/commitdiff
patch 8.2.3053: Vim9: cannot assign to @@ in :def function v8.2.3053
authorBram Moolenaar <Bram@vim.org>
Sat, 26 Jun 2021 11:28:35 +0000 (13:28 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 26 Jun 2021 11:28:35 +0000 (13:28 +0200)
Problem:    Vim9: cannot assign to @@ in :def function
Solution:   Handle '@' like '"'.

src/testdir/test_vim9_assign.vim
src/version.c
src/vim9compile.c

index cba79729c18c6b2d463e333e23c3103aa0e986da..55b850a4b6976daf7c3ce2a2105c1bda28186fed 100644 (file)
@@ -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:')
index 2b320471b3b832ff860ba4618e66a23356306dbc..429fb69d5888b5ea39d49dba5bfd90660f8175da 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3053,
 /**/
     3052,
 /**/
index bb5ea9726e01ce863d86bb6f7b1260cde15fb891..b8a879440d98e71b01625d8a9edf4ccee40ea8df 100644 (file)
@@ -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;