# HG changeset patch # User Bram Moolenaar # Date 1624707004 -7200 # Node ID 123590c942b7d86320afaee0c07fba5df29d86d6 # Parent e52b5b8cfee4e69aed152f19e8cf48aee160c3b4 patch 8.2.3053: Vim9: cannot assign to @@ in :def function Commit: https://github.com/vim/vim/commit/13e45d14ba7f590fb243c041bc45e6d4d47c8432 Author: Bram Moolenaar 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 '"'. diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim --- 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:') diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/vim9compile.c b/src/vim9compile.c --- 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;