&ts %= 4
assert_equal(2, &ts)
+ if has('float')
+ let f100: float = 100.0
+ f100 /= 5
+ assert_equal(20.0, f100)
+
+ let f200: float = 200.0
+ f200 /= 5.0
+ assert_equal(40.0, f200)
+
+ CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
+ endif
+
lines =<< trim END
vim9script
&ts = 6
lvar->lv_type = stacktype;
}
}
- else
+ else if (*op == '=')
{
type_T *use_type = lvar->lv_type;
+ // without operator type is here, otherwise below
if (has_index)
{
use_type = use_type->tt_member;
use_type = &t_void;
}
if (need_type(stacktype, use_type, -1, cctx, FALSE)
- == FAIL)
+ == FAIL)
goto theend;
}
}
if (oplen > 0 && *op != '=')
{
- type_T *expected = &t_number;
+ type_T *expected;
type_T *stacktype;
- // TODO: if type is known use float or any operation
- // TODO: check operator matches variable type
-
if (*op == '.')
expected = &t_string;
- else if (*op == '+')
+ else
expected = member_type;
stacktype = ((type_T **)stack->ga_data)[stack->ga_len - 1];
- if (need_type(stacktype, expected, -1, cctx, FALSE) == FAIL)
+ if (
+#ifdef FEAT_FLOAT
+ // If variable is float operation with number is OK.
+ !(expected == &t_float && stacktype == &t_number) &&
+#endif
+ need_type(stacktype, expected, -1, cctx, FALSE) == FAIL)
goto theend;
if (*op == '.')
member_type, stacktype) == FAIL)
goto theend;
}
- else
- {
- isn_T *isn = generate_instr_drop(cctx, ISN_OPNR, 1);
-
- if (isn == NULL)
- goto theend;
- switch (*op)
- {
- case '-': isn->isn_arg.op.op_type = EXPR_SUB; break;
- case '*': isn->isn_arg.op.op_type = EXPR_MULT; break;
- case '/': isn->isn_arg.op.op_type = EXPR_DIV; break;
- case '%': isn->isn_arg.op.op_type = EXPR_REM; break;
- }
- }
+ else if (generate_two_op(cctx, op) == FAIL)
+ goto theend;
}
if (has_index)