patch 8.2.2268: Vim9: list unpack seen as declaration
Problem: Vim9: list unpack seen as declaration.
Solution: Check for "var". (closes #7594)
diff --git a/src/evalvars.c b/src/evalvars.c
index 73b9f3d..94b857e 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -912,7 +912,7 @@
int copy, // copy values from "tv", don't move
int semicolon, // from skip_var_list()
int var_count, // from skip_var_list()
- int flags, // ASSIGN_FINAL, ASSIGN_CONST, ASSIGN_NO_DECL
+ int flags, // ASSIGN_FINAL, ASSIGN_CONST, etc.
char_u *op)
{
char_u *arg = arg_start;
@@ -1267,7 +1267,7 @@
char_u *arg, // points to variable name
typval_T *tv, // value to assign to variable
int copy, // copy value from "tv"
- int flags, // ASSIGN_CONST, ASSIGN_FINAL, ASSIGN_NO_DECL
+ int flags, // ASSIGN_CONST, ASSIGN_FINAL, etc.
char_u *endchars, // valid chars after variable name or NULL
char_u *op) // "+", "-", "." or NULL
{
@@ -1279,7 +1279,7 @@
int opt_flags;
char_u *tofree = NULL;
- if (in_vim9script() && (flags & ASSIGN_NO_DECL) == 0
+ if (in_vim9script() && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
&& (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0
&& vim_strchr((char_u *)"$@&", *arg) != NULL)
{
@@ -1476,7 +1476,8 @@
lval_T lv;
p = get_lval(arg, tv, &lv, FALSE, FALSE,
- (flags & ASSIGN_NO_DECL) ? GLV_NO_DECL : 0, FNE_CHECK_START);
+ (flags & (ASSIGN_NO_DECL | ASSIGN_DECL))
+ ? GLV_NO_DECL : 0, FNE_CHECK_START);
if (p != NULL && lv.ll_name != NULL)
{
if (endchars != NULL && vim_strchr(endchars,
@@ -3053,7 +3054,7 @@
typval_T *tv,
int copy) // make copy of value in "tv"
{
- set_var_const(name, NULL, tv, copy, ASSIGN_NO_DECL);
+ set_var_const(name, NULL, tv, copy, ASSIGN_DECL);
}
/*
@@ -3067,7 +3068,7 @@
type_T *type,
typval_T *tv_arg,
int copy, // make copy of value in "tv"
- int flags) // ASSIGN_CONST, ASSIGN_FINAL, ASSIGN_NO_DECL
+ int flags) // ASSIGN_CONST, ASSIGN_FINAL, etc.
{
typval_T *tv = tv_arg;
typval_T bool_tv;
@@ -3087,7 +3088,7 @@
if (vim9script
&& !is_script_local
- && (flags & ASSIGN_NO_DECL) == 0
+ && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
&& (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0
&& name[1] == ':')
{
@@ -3126,7 +3127,7 @@
if (is_script_local && vim9script)
{
- if ((flags & ASSIGN_NO_DECL) == 0)
+ if ((flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0)
{
semsg(_(e_redefining_script_item_str), name);
goto failed;
@@ -3200,8 +3201,15 @@
clear_tv(&di->di_tv);
}
- else // add a new variable
+ else
{
+ // add a new variable
+ if (vim9script && is_script_local && (flags & ASSIGN_NO_DECL))
+ {
+ semsg(_(e_unknown_variable_str), name);
+ goto failed;
+ }
+
// Can't add "v:" or "a:" variable.
if (ht == &vimvarht || ht == get_funccal_args_ht())
{