diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-11-26 17:36:51 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-11-26 17:36:51 +0000 |
commit | 7824fc80f675b8098e6483ce082e287aad14b6da (patch) | |
tree | 7958a448ca9c5d0a45fef498b670a355f2f92b44 /src/evalvars.c | |
parent | bfc5786a61693aaadc3e45f80a2f147c3a6711a3 (diff) | |
download | vim-git-7824fc80f675b8098e6483ce082e287aad14b6da.tar.gz |
patch 8.2.3682: Vim9: assigning to a script variable drops the typev8.2.3682
Problem: Vim9: assigning to a script variable drops the required type.
Solution: Lookup the type of the variable and use it. (closes #9219)
Diffstat (limited to 'src/evalvars.c')
-rw-r--r-- | src/evalvars.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/evalvars.c b/src/evalvars.c index b1d7b78c8..434fd9611 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -3206,13 +3206,14 @@ set_var( void set_var_const( char_u *name, - type_T *type, + type_T *type_arg, typval_T *tv_arg, int copy, // make copy of value in "tv" int flags_arg, // ASSIGN_CONST, ASSIGN_FINAL, etc. int var_idx) // index for ":let [a, b] = list" { typval_T *tv = tv_arg; + type_T *type = type_arg; typval_T bool_tv; dictitem_T *di; typval_T *dest_tv = NULL; @@ -3334,13 +3335,18 @@ set_var_const( if (var_in_vim9script && (flags & ASSIGN_FOR_LOOP) == 0) { where_T where = WHERE_INIT; + svar_T *sv = find_typval_in_script(&di->di_tv); - // check the type and adjust to bool if needed - where.wt_index = var_idx; - where.wt_variable = TRUE; - if (check_script_var_type(&di->di_tv, tv, name, where) - == FAIL) - goto failed; + if (sv != NULL) + { + // check the type and adjust to bool if needed + where.wt_index = var_idx; + where.wt_variable = TRUE; + if (check_script_var_type(sv, tv, name, where) == FAIL) + goto failed; + if (type == NULL) + type = sv->sv_type; + } } if ((flags & ASSIGN_FOR_LOOP) == 0 |