1
0
forked from aniani/vim

patch 8.2.1357: Vim9: cannot assign to / register

Problem:    Vim9: cannot assign to / register.
Solution:   Adjust check for assignment.
This commit is contained in:
Bram Moolenaar
2020-08-02 18:58:54 +02:00
parent 7226e5b19b
commit 658217276f
4 changed files with 24 additions and 6 deletions

View File

@@ -1439,6 +1439,13 @@ def Test_expr7_register()
normal axyz normal axyz
assert_equal("xyz", @.) assert_equal("xyz", @.)
call CheckDefFailure(["@. = 'yes'"], 'E354:')
@/ = 'slash'
assert_equal('slash', @/)
@= = 'equal'
assert_equal('equal', @=)
enddef enddef
def Test_expr7_namespace() def Test_expr7_namespace()

View File

@@ -470,8 +470,9 @@ def Test_assignment_failure()
call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 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 @a = 5'], 'E1066:')
call CheckDefFailure(['let @/ = "x"'], 'E1066:')
call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1357,
/**/ /**/
1356, 1356,
/**/ /**/

View File

@@ -5214,9 +5214,14 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
int has_index = FALSE; int has_index = FALSE;
int instr_count = -1; int instr_count = -1;
p = (*var_start == '&' || *var_start == '$' if (*var_start == '@')
|| *var_start == '@') ? var_start + 1 : var_start; p = var_start + 2;
else
{
p = (*var_start == '&' || *var_start == '$')
? var_start + 1 : var_start;
p = to_name_end(p, TRUE); p = to_name_end(p, TRUE);
}
// "a: type" is declaring variable "a" with a type, not "a:". // "a: type" is declaring variable "a" with a type, not "a:".
if (is_decl && var_end == var_start + 2 && var_end[-1] == ':') if (is_decl && var_end == var_start + 2 && var_end[-1] == ':')
@@ -5279,7 +5284,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
} }
else if (*var_start == '@') 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]); emsg_invreg(var_start[1]);
goto theend; goto theend;
@@ -7247,6 +7252,9 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
int oplen; int oplen;
int heredoc; int heredoc;
if (ea.cmd[0] == '@')
var_end = ea.cmd + 2;
else
var_end = find_name_end(pskip, NULL, NULL, var_end = find_name_end(pskip, NULL, NULL,
FNE_CHECK_START | FNE_INCL_BR); FNE_CHECK_START | FNE_INCL_BR);
oplen = assignment_len(skipwhite(var_end), &heredoc); oplen = assignment_len(skipwhite(var_end), &heredoc);