comparison src/evalvars.c @ 23450:a8e7acf71fa4 v8.2.2268

patch 8.2.2268: Vim9: list unpack seen as declaration Commit: https://github.com/vim/vim/commit/3862ea3f620f02569c2d816ca9ceeeac3a0ad901 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jan 1 21:05:55 2021 +0100 patch 8.2.2268: Vim9: list unpack seen as declaration Problem: Vim9: list unpack seen as declaration. Solution: Check for "var". (closes https://github.com/vim/vim/issues/7594)
author Bram Moolenaar <Bram@vim.org>
date Fri, 01 Jan 2021 21:15:04 +0100
parents 8f31b990ab1e
children d2b1269c2c68
comparison
equal deleted inserted replaced
23449:f04821549e6f 23450:a8e7acf71fa4
910 char_u *arg_start, 910 char_u *arg_start,
911 typval_T *tv, 911 typval_T *tv,
912 int copy, // copy values from "tv", don't move 912 int copy, // copy values from "tv", don't move
913 int semicolon, // from skip_var_list() 913 int semicolon, // from skip_var_list()
914 int var_count, // from skip_var_list() 914 int var_count, // from skip_var_list()
915 int flags, // ASSIGN_FINAL, ASSIGN_CONST, ASSIGN_NO_DECL 915 int flags, // ASSIGN_FINAL, ASSIGN_CONST, etc.
916 char_u *op) 916 char_u *op)
917 { 917 {
918 char_u *arg = arg_start; 918 char_u *arg = arg_start;
919 list_T *l; 919 list_T *l;
920 int i; 920 int i;
1265 static char_u * 1265 static char_u *
1266 ex_let_one( 1266 ex_let_one(
1267 char_u *arg, // points to variable name 1267 char_u *arg, // points to variable name
1268 typval_T *tv, // value to assign to variable 1268 typval_T *tv, // value to assign to variable
1269 int copy, // copy value from "tv" 1269 int copy, // copy value from "tv"
1270 int flags, // ASSIGN_CONST, ASSIGN_FINAL, ASSIGN_NO_DECL 1270 int flags, // ASSIGN_CONST, ASSIGN_FINAL, etc.
1271 char_u *endchars, // valid chars after variable name or NULL 1271 char_u *endchars, // valid chars after variable name or NULL
1272 char_u *op) // "+", "-", "." or NULL 1272 char_u *op) // "+", "-", "." or NULL
1273 { 1273 {
1274 int c1; 1274 int c1;
1275 char_u *name; 1275 char_u *name;
1277 char_u *arg_end = NULL; 1277 char_u *arg_end = NULL;
1278 int len; 1278 int len;
1279 int opt_flags; 1279 int opt_flags;
1280 char_u *tofree = NULL; 1280 char_u *tofree = NULL;
1281 1281
1282 if (in_vim9script() && (flags & ASSIGN_NO_DECL) == 0 1282 if (in_vim9script() && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
1283 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0 1283 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0
1284 && vim_strchr((char_u *)"$@&", *arg) != NULL) 1284 && vim_strchr((char_u *)"$@&", *arg) != NULL)
1285 { 1285 {
1286 vim9_declare_error(arg); 1286 vim9_declare_error(arg);
1287 return NULL; 1287 return NULL;
1474 else if (eval_isnamec1(*arg) || *arg == '{') 1474 else if (eval_isnamec1(*arg) || *arg == '{')
1475 { 1475 {
1476 lval_T lv; 1476 lval_T lv;
1477 1477
1478 p = get_lval(arg, tv, &lv, FALSE, FALSE, 1478 p = get_lval(arg, tv, &lv, FALSE, FALSE,
1479 (flags & ASSIGN_NO_DECL) ? GLV_NO_DECL : 0, FNE_CHECK_START); 1479 (flags & (ASSIGN_NO_DECL | ASSIGN_DECL))
1480 ? GLV_NO_DECL : 0, FNE_CHECK_START);
1480 if (p != NULL && lv.ll_name != NULL) 1481 if (p != NULL && lv.ll_name != NULL)
1481 { 1482 {
1482 if (endchars != NULL && vim_strchr(endchars, 1483 if (endchars != NULL && vim_strchr(endchars,
1483 *skipwhite(lv.ll_name_end)) == NULL) 1484 *skipwhite(lv.ll_name_end)) == NULL)
1484 emsg(_(e_letunexp)); 1485 emsg(_(e_letunexp));
3051 set_var( 3052 set_var(
3052 char_u *name, 3053 char_u *name,
3053 typval_T *tv, 3054 typval_T *tv,
3054 int copy) // make copy of value in "tv" 3055 int copy) // make copy of value in "tv"
3055 { 3056 {
3056 set_var_const(name, NULL, tv, copy, ASSIGN_NO_DECL); 3057 set_var_const(name, NULL, tv, copy, ASSIGN_DECL);
3057 } 3058 }
3058 3059
3059 /* 3060 /*
3060 * Set variable "name" to value in "tv". 3061 * Set variable "name" to value in "tv".
3061 * If the variable already exists and "is_const" is FALSE the value is updated. 3062 * If the variable already exists and "is_const" is FALSE the value is updated.
3065 set_var_const( 3066 set_var_const(
3066 char_u *name, 3067 char_u *name,
3067 type_T *type, 3068 type_T *type,
3068 typval_T *tv_arg, 3069 typval_T *tv_arg,
3069 int copy, // make copy of value in "tv" 3070 int copy, // make copy of value in "tv"
3070 int flags) // ASSIGN_CONST, ASSIGN_FINAL, ASSIGN_NO_DECL 3071 int flags) // ASSIGN_CONST, ASSIGN_FINAL, etc.
3071 { 3072 {
3072 typval_T *tv = tv_arg; 3073 typval_T *tv = tv_arg;
3073 typval_T bool_tv; 3074 typval_T bool_tv;
3074 dictitem_T *di; 3075 dictitem_T *di;
3075 char_u *varname; 3076 char_u *varname;
3085 } 3086 }
3086 is_script_local = ht == get_script_local_ht(); 3087 is_script_local = ht == get_script_local_ht();
3087 3088
3088 if (vim9script 3089 if (vim9script
3089 && !is_script_local 3090 && !is_script_local
3090 && (flags & ASSIGN_NO_DECL) == 0 3091 && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
3091 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0 3092 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0
3092 && name[1] == ':') 3093 && name[1] == ':')
3093 { 3094 {
3094 vim9_declare_error(name); 3095 vim9_declare_error(name);
3095 goto failed; 3096 goto failed;
3124 goto failed; 3125 goto failed;
3125 } 3126 }
3126 3127
3127 if (is_script_local && vim9script) 3128 if (is_script_local && vim9script)
3128 { 3129 {
3129 if ((flags & ASSIGN_NO_DECL) == 0) 3130 if ((flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0)
3130 { 3131 {
3131 semsg(_(e_redefining_script_item_str), name); 3132 semsg(_(e_redefining_script_item_str), name);
3132 goto failed; 3133 goto failed;
3133 } 3134 }
3134 3135
3198 } 3199 }
3199 } 3200 }
3200 3201
3201 clear_tv(&di->di_tv); 3202 clear_tv(&di->di_tv);
3202 } 3203 }
3203 else // add a new variable 3204 else
3204 { 3205 {
3206 // add a new variable
3207 if (vim9script && is_script_local && (flags & ASSIGN_NO_DECL))
3208 {
3209 semsg(_(e_unknown_variable_str), name);
3210 goto failed;
3211 }
3212
3205 // Can't add "v:" or "a:" variable. 3213 // Can't add "v:" or "a:" variable.
3206 if (ht == &vimvarht || ht == get_funccal_args_ht()) 3214 if (ht == &vimvarht || ht == get_funccal_args_ht())
3207 { 3215 {
3208 semsg(_(e_illvar), name); 3216 semsg(_(e_illvar), name);
3209 goto failed; 3217 goto failed;