From 13e45d14ba7f590fb243c041bc45e6d4d47c8432 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 26 Jun 2021 13:28:35 +0200 Subject: [PATCH] patch 8.2.3053: Vim9: cannot assign to @@ in :def function Problem: Vim9: cannot assign to @@ in :def function Solution: Handle '@' like '"'. --- src/testdir/test_vim9_assign.vim | 25 +++++++++++++++---------- src/version.c | 2 ++ src/vim9compile.c | 3 ++- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index cba79729c..55b850a4b 100644 --- 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 index 2b320471b..429fb69d5 100644 --- 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 */ +/**/ + 3053, /**/ 3052, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index bb5ea9726..b8a879440 100644 --- 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; -- 2.40.0