patch 8.2.2770: Vim9: type of loop variable is not used
Problem: Vim9: type of loop variable is not used.
Solution: Parse and check the variable type. (closes #8107)
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 78c387f..4ae3b41 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -7514,12 +7514,16 @@
return NULL;
}
- if (vartype->tt_type == VAR_LIST && vartype->tt_member->tt_type != VAR_ANY)
+ if (vartype->tt_type == VAR_STRING)
+ item_type = &t_string;
+ else if (vartype->tt_type == VAR_LIST
+ && vartype->tt_member->tt_type != VAR_ANY)
{
if (var_count == 1)
item_type = vartype->tt_member;
else if (vartype->tt_member->tt_type == VAR_LIST
&& vartype->tt_member->tt_member->tt_type != VAR_ANY)
+ // TODO: should get the type from
item_type = vartype->tt_member->tt_member;
}
@@ -7557,12 +7561,19 @@
int opt_flags = 0;
int vimvaridx = -1;
type_T *type = &t_any;
+ type_T *lhs_type = &t_any;
+ where_T where;
p = skip_var_one(arg, FALSE);
varlen = p - arg;
name = vim_strnsave(arg, varlen);
if (name == NULL)
goto failed;
+ if (*p == ':')
+ {
+ p = skipwhite(p + 1);
+ lhs_type = parse_type(&p, cctx->ctx_type_list, TRUE);
+ }
// TODO: script var not supported?
if (get_var_dest(name, &dest, CMD_for, &opt_flags,
@@ -7589,8 +7600,15 @@
}
// Reserve a variable to store "var".
- // TODO: check for type
- var_lvar = reserve_local(cctx, arg, varlen, TRUE, &t_any);
+ where.wt_index = var_count > 1 ? idx + 1 : 0;
+ where.wt_variable = TRUE;
+ if (lhs_type == &t_any)
+ lhs_type = item_type;
+ else if (item_type != &t_unknown
+ && !(var_count > 1 && item_type == &t_any)
+ && check_type(lhs_type, item_type, TRUE, where) == FAIL)
+ goto failed;
+ var_lvar = reserve_local(cctx, arg, varlen, TRUE, lhs_type);
if (var_lvar == NULL)
// out of memory or used as an argument
goto failed;
@@ -7602,8 +7620,6 @@
generate_STORE(cctx, ISN_STORE, var_lvar->lv_idx, NULL);
}
- if (*p == ':')
- p = skip_type(skipwhite(p + 1), FALSE);
if (*p == ',' || *p == ';')
++p;
arg = skipwhite(p);