mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.2320: Vim9: no error for comparing bool with string
Problem: Vim9: no error for comparing bool with string. Solution: Check for wrong types when comparing. (closes #7639)
This commit is contained in:
@@ -341,3 +341,5 @@ EXTERN char e_mismatched_endfunction[]
|
||||
INIT(= N_("E1151: Mismatched endfunction"));
|
||||
EXTERN char e_mismatched_enddef[]
|
||||
INIT(= N_("E1152: Mismatched enddef"));
|
||||
EXTERN char e_invalid_operation_for_bool[]
|
||||
INIT(= N_("E1153: Invalid operation for bool"));
|
||||
|
@@ -597,6 +597,18 @@ def Test_expr4_equal()
|
||||
CheckDefFailure(["var x = 'a' == "], 'E1097:', 3)
|
||||
|
||||
CheckDefExecFailure(['var items: any', 'eval 1', 'eval 2', 'if items == []', 'endif'], 'E691:', 4)
|
||||
|
||||
CheckDefExecFailure(['var x: any = "a"', 'echo x == true'], 'E1072: Cannot compare string with bool', 2)
|
||||
CheckDefExecFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2)
|
||||
CheckDefExecFailure(["var x: any = 99", 'echo x == true'], 'E1138', 2)
|
||||
CheckDefExecFailure(["var x: any = 'a'", 'echo x == 99'], 'E1030:', 2)
|
||||
|
||||
for op in ['>', '>=', '<', '<=', '=~', '!~']
|
||||
CheckDefExecFailure([
|
||||
"var a: any = 'a'",
|
||||
'var b: any = true',
|
||||
'echo a ' .. op .. ' b'], 'E1072:', 3)
|
||||
endfor
|
||||
enddef
|
||||
|
||||
" test != comperator
|
||||
|
24
src/typval.c
24
src/typval.c
@@ -834,6 +834,30 @@ typval_compare(
|
||||
default: break; // avoid gcc warning
|
||||
}
|
||||
}
|
||||
else if (in_vim9script() && (typ1->v_type == VAR_BOOL
|
||||
|| typ2->v_type == VAR_BOOL))
|
||||
{
|
||||
if (typ1->v_type != typ2->v_type)
|
||||
{
|
||||
semsg(_(e_cannot_compare_str_with_str),
|
||||
vartype_name(typ1->v_type), vartype_name(typ2->v_type));
|
||||
clear_tv(typ1);
|
||||
return FAIL;
|
||||
}
|
||||
n1 = typ1->vval.v_number;
|
||||
n2 = typ2->vval.v_number;
|
||||
switch (type)
|
||||
{
|
||||
case EXPR_IS:
|
||||
case EXPR_EQUAL: n1 = (n1 == n2); break;
|
||||
case EXPR_ISNOT:
|
||||
case EXPR_NEQUAL: n1 = (n1 != n2); break;
|
||||
default:
|
||||
emsg(_(e_invalid_operation_for_bool));
|
||||
clear_tv(typ1);
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
s1 = tv_get_string_buf(typ1, buf1);
|
||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
2320,
|
||||
/**/
|
||||
2319,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user