]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.3176: Vim9: no type error for comparing number with string v8.2.3176
authorBram Moolenaar <Bram@vim.org>
Sun, 18 Jul 2021 12:43:43 +0000 (14:43 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 18 Jul 2021 12:43:43 +0000 (14:43 +0200)
Problem:    Vim9: no type error for comparing number with string.
Solution:   Add a runtime type check. (closes #8571)

src/errors.h
src/testdir/test_vim9_expr.vim
src/typval.c
src/version.c

index 46de733bc63ade5229df5811be8e769485c68424..35d1487338391ab83537a8309d16f644da90ff4a 100644 (file)
@@ -381,8 +381,8 @@ 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"));
+EXTERN char e_invalid_operation_for_str[]
+       INIT(= N_("E1153: Invalid operation for %s"));
 EXTERN char e_divide_by_zero[]
        INIT(= N_("E1154: Divide by zero"));
 EXTERN char e_cannot_define_autocommands_for_all_events[]
index cd6ffa446363d254ef2ebe66f98296b27f845704..e7c08f4af0c829fa24a6df0a8e7610847ba0a908 100644 (file)
@@ -660,13 +660,36 @@ def Test_expr4_equal()
   CheckDefExecAndScriptFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2)
   CheckDefExecAndScriptFailure2(["var x: any = 99", 'echo x == true'], 'E1138', 'E1072:', 2)
   CheckDefExecAndScriptFailure2(["var x: any = 'a'", 'echo x == 99'], 'E1030:', 'E1072:', 2)
+enddef
 
+def Test_expr4_wrong_type()
   for op in ['>', '>=', '<', '<=', '=~', '!~']
     CheckDefExecAndScriptFailure([
         "var a: any = 'a'",
         'var b: any = true',
         'echo a ' .. op .. ' b'], 'E1072:', 3)
   endfor
+  for op in ['>', '>=', '<', '<=']
+    CheckDefExecAndScriptFailure2([
+        "var n: any = 2",
+        'echo n ' .. op .. ' "3"'], 'E1030:', 'E1072:', 2)
+  endfor
+  for op in ['=~', '!~']
+    CheckDefExecAndScriptFailure([
+        "var n: any = 2",
+        'echo n ' .. op .. ' "3"'], 'E1072:', 2)
+  endfor
+
+  CheckDefAndScriptFailure([
+      'echo v:none == true'], 'E1072:', 1)
+  CheckDefAndScriptFailure([
+      'echo false >= true'], 'E1072:', 1)
+  CheckDefExecAndScriptFailure([
+      "var n: any = v:none",
+      'echo n == true'], 'E1072:', 2)
+  CheckDefExecAndScriptFailure([
+      "var n: any = v:none",
+      'echo n < true'], 'E1072:', 2)
 enddef
 
 " test != comperator
index 03891c806dec356bd4454bc5b4ceb9a03aef438d..9d5903f649063c8cad559fc43751e4a0e79b62f7 100644 (file)
@@ -937,7 +937,9 @@ typval_compare(
        }
     }
     else if (in_vim9script() && (typ1->v_type == VAR_BOOL
-                                                || typ2->v_type == VAR_BOOL))
+                                   || typ2->v_type == VAR_BOOL
+                                   || (typ1->v_type == VAR_SPECIAL
+                                             && typ2->v_type == VAR_SPECIAL)))
     {
        if (typ1->v_type != typ2->v_type)
        {
@@ -955,13 +957,23 @@ typval_compare(
            case EXPR_ISNOT:
            case EXPR_NEQUAL:   n1 = (n1 != n2); break;
            default:
-               emsg(_(e_invalid_operation_for_bool));
+               semsg(_(e_invalid_operation_for_str),
+                                                  vartype_name(typ1->v_type));
                clear_tv(typ1);
                return FAIL;
        }
     }
     else
     {
+       if (in_vim9script()
+             && ((typ1->v_type != VAR_STRING && typ1->v_type != VAR_SPECIAL)
+              || (typ2->v_type != VAR_STRING && typ2->v_type != VAR_SPECIAL)))
+       {
+           semsg(_(e_cannot_compare_str_with_str),
+                      vartype_name(typ1->v_type), vartype_name(typ2->v_type));
+           clear_tv(typ1);
+           return FAIL;
+       }
        s1 = tv_get_string_buf(typ1, buf1);
        s2 = tv_get_string_buf(typ2, buf2);
        if (type != EXPR_MATCH && type != EXPR_NOMATCH)
index 8b674d377383911d07ba922b352d4bba2ce44641..c1a4f3f8fa132753fb7e741acffff87fab326784 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3176,
 /**/
     3175,
 /**/