0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 9.0.0623: error for modifying a const is not detected at compile time

Problem:    Error for modifying a const is not detected at compile time.
Solution:   Add TTFLAG_CONST and check for it in add() and extend().
This commit is contained in:
Bram Moolenaar
2022-09-29 19:14:42 +01:00
parent 9f573a8df0
commit fa1039760e
12 changed files with 446 additions and 62 deletions

View File

@@ -462,6 +462,29 @@ need_type(
cctx, silent, actual_is_const);
}
/*
* Set type of variable "lvar" to "type". If the variable is a constant then
* the type gets TTFLAG_CONST.
*/
static void
set_var_type(lvar_T *lvar, type_T *type_arg, cctx_T *cctx)
{
type_T *type = type_arg;
if (lvar->lv_const && (type->tt_flags & TTFLAG_CONST) == 0)
{
if (type->tt_flags & TTFLAG_STATIC)
// entry in static_types[] is followed by const type
type = type + 1;
else
{
type = copy_type(type, cctx->ctx_type_list);
type->tt_flags |= TTFLAG_CONST;
}
}
lvar->lv_type = type;
}
/*
* Reserve space for a local variable.
* Return the variable or NULL if it failed.
@@ -497,7 +520,12 @@ reserve_local(
lvar->lv_name = vim_strnsave(name, len == 0 ? STRLEN(name) : len);
lvar->lv_const = isConst;
lvar->lv_type = type;
if (type == &t_unknown || type == &t_any)
// type not known yet, may be inferred from RHS
lvar->lv_type = type;
else
// may use TTFLAG_CONST
set_var_type(lvar, type, cctx);
// Remember the name for debugging.
if (GA_GROW_FAILS(&dfunc->df_var_names, 1))
@@ -2304,19 +2332,22 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
}
else
{
type_T *type;
// An empty list or dict has a &t_unknown member,
// for a variable that implies &t_any.
if (rhs_type == &t_list_empty)
lhs.lhs_lvar->lv_type = &t_list_any;
type = &t_list_any;
else if (rhs_type == &t_dict_empty)
lhs.lhs_lvar->lv_type = &t_dict_any;
type = &t_dict_any;
else if (rhs_type == &t_unknown)
lhs.lhs_lvar->lv_type = &t_any;
type = &t_any;
else
{
lhs.lhs_lvar->lv_type = rhs_type;
type = rhs_type;
inferred_type = rhs_type;
}
set_var_type(lhs.lhs_lvar, type, cctx);
}
}
else if (*op == '=')