CheckDefExecAndScriptFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2)
CheckDefExecAndScriptFailure(["var x: any = 99", 'echo x == true'], ['E1138', 'E1072:'], 2)
CheckDefExecAndScriptFailure(["var x: any = 'a'", 'echo x == 99'], ['E1030:', 'E1072:'], 2)
+
+ lines =<< trim END
+ vim9script
+ var n: any = 2
+ def Compare()
+ eval n == '3'
+ g:notReached = false
+ enddef
+ g:notReached = true
+ Compare()
+ END
+ CheckScriptFailure(lines, 'E1030: Using a String as a Number: "3"')
+ assert_true(g:notReached)
+
+ if has('float')
+ lines =<< trim END
+ vim9script
+ var n: any = 2.2
+ def Compare()
+ eval n == '3'
+ g:notReached = false
+ enddef
+ g:notReached = true
+ Compare()
+ END
+ CheckScriptFailure(lines, 'E892: Using a String as a Float')
+ assert_true(g:notReached)
+ endif
+
+ unlet g:notReached
enddef
def Test_expr4_wrong_type()
}
#if defined(FEAT_FLOAT) || defined(PROTO)
- float_T
-tv_get_float(typval_T *varp)
+ static float_T
+tv_get_float_chk(typval_T *varp, int *error)
{
switch (varp->v_type)
{
internal_error_no_abort("tv_get_float(UNKNOWN)");
break;
}
+ if (error != NULL)
+ *error = TRUE;
return 0;
}
+
+ float_T
+tv_get_float(typval_T *varp)
+{
+ return tv_get_float_chk(varp, NULL);
+}
#endif
/*
&& type != EXPR_MATCH && type != EXPR_NOMATCH)
{
float_T f1, f2;
+ int error = FALSE;
- f1 = tv_get_float(tv1);
- f2 = tv_get_float(tv2);
+ f1 = tv_get_float_chk(tv1, &error);
+ if (!error)
+ f2 = tv_get_float_chk(tv2, &error);
+ if (error)
+ {
+ clear_tv(tv1);
+ return FAIL;
+ }
n1 = FALSE;
switch (type)
{
else if ((tv1->v_type == VAR_NUMBER || tv2->v_type == VAR_NUMBER)
&& type != EXPR_MATCH && type != EXPR_NOMATCH)
{
- n1 = tv_get_number(tv1);
- n2 = tv_get_number(tv2);
+ int error = FALSE;
+
+ n1 = tv_get_number_chk(tv1, &error);
+ if (!error)
+ n2 = tv_get_number_chk(tv2, &error);
+ if (error)
+ {
+ clear_tv(tv1);
+ return FAIL;
+ }
switch (type)
{
case EXPR_IS: