patch 9.1.1801: Vim9: misleading error when extending dictionary
Commit:
https://github.com/vim/vim/commit/ad43d2639d4031ff1893bde763505e6d4d13a6ca
Author: Yegappan Lakshmanan <[email protected]>
Date: Sun Sep 28 17:17:37 2025 +0000
patch 9.1.1801: Vim9: misleading error when extending dictionary
Problem: Vim9: misleading error when extending dictionary
(lacygoill)
Solution: Give a proper error message when a Dict type is used with a
compound operator (Yegappan Lakshmanan)
fixes: #8072
closes: #18426
Signed-off-by: Yegappan Lakshmanan <[email protected]>
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 602114859..b7b09c972 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -3414,6 +3414,19 @@ def Test_type_check()
v9.CheckScriptFailure(lines, 'E1411: Missing dot after object "o"')
enddef
+" Test for using a compound operator with a dict
+def Test_dict_compoundop_check()
+ for op in ['+=', '-=', '*=', '/=', '%=']
+ v9.CheckSourceDefAndScriptFailure(['var d: dict<number> = {a: 1}', $'d
{op} 1'], $'E734: Wrong variable type for {op}')
+ endfor
+ var lines =<< trim END
+ var d: dict<number> = {a: 1}
+ d['a'] += 2
+ assert_equal({a: 3}, d)
+ END
+ v9.CheckSourceDefAndScriptSuccess(lines)
+enddef
+
" Test for checking the argument type of a def function
def Test_func_argtype_check()
var lines =<< trim END
diff --git a/src/version.c b/src/version.c
index 1faf29ad3..47d461971 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1801,
/**/
1800,
/**/
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 91c1c0c9e..efbea5914 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3439,26 +3439,41 @@ compile_assign_rhs(cctx_T *cctx, cac_T *cac)
}
/*
- * Compile a compound op assignment statement (+=, -=, *=, %=, etc.)
+ * Returns OK if "type" supports compound operator "op_arg" (e.g. +=, -=, %=,
+ * etc.). Compound operators are not supported with a tuple and a dict.
+ * Returns FAIL if compound operator is not supported.
*/
static int
-compile_assign_compound_op(cctx_T *cctx, cac_T *cac)
+check_type_supports_compound_op(type_T *type, char_u op_arg)
{
- lhs_T *lhs = &cac->cac_lhs;
- type_T *expected;
- type_T *stacktype = NULL;
-
- if (cac->cac_lhs.lhs_type->tt_type == VAR_TUPLE)
+ if (type->tt_type == VAR_TUPLE || type->tt_type == VAR_DICT)
{
- // compound operators are not supported with a tuple
char_u op[2];
- op[0] = *cac->cac_op;
+ op[0] = op_arg;
op[1] = NUL;
semsg(_(e_wrong_variable_type_for_str_equal), op);
return FAIL;
}
+ return OK;
+}
+
+/*
+ * Compile a compound op assignment statement (+=, -=, *=, %=, etc.)
+ */
+ static int
+compile_assign_compound_op(cctx_T *cctx, cac_T *cac)
+{
+ lhs_T *lhs = &cac->cac_lhs;
+ type_T *expected;
+ type_T *stacktype = NULL;
+
+ if (cac->cac_lhs.lhs_type->tt_type == VAR_TUPLE
+ && check_type_supports_compound_op(cac->cac_lhs.lhs_type,
+ *cac->cac_op) == FAIL)
+ return FAIL;
+
if (*cac->cac_op == '.')
{
expected = lhs->lhs_member_type;
@@ -3474,6 +3489,10 @@ compile_assign_compound_op(cctx_T *cctx, cac_T *cac)
{
expected = lhs->lhs_member_type;
stacktype = get_type_on_stack(cctx, 0);
+
+ if (check_type_supports_compound_op(expected, *cac->cac_op) == FAIL)
+ return FAIL;
+
if (
// If variable is float operation with number is OK.
!(expected == &t_float && (stacktype == &t_number
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/vim_dev/E1v2vDt-00HA5S-Bt%40256bit.org.