]> granicus.if.org Git - vim/commitdiff
patch 8.2.1323: Vim9: invalid operators only rejected in :def function v8.2.1323
authorBram Moolenaar <Bram@vim.org>
Wed, 29 Jul 2020 19:20:41 +0000 (21:20 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 29 Jul 2020 19:20:41 +0000 (21:20 +0200)
Problem:    Vim9: invalid operators only rejected in :def function.
Solution:   Also reject them at script level. (closes #6564)

src/eval.c
src/proto/vim9compile.pro
src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c

index 81913c7a353012a99623531ce50b31e9e19073d9..451bb16b7c58d649c1d31184706eb12ddcb38be2 100644 (file)
@@ -2420,9 +2420,9 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
 {
     char_u     *p;
     int                getnext;
-    int                i;
     exptype_T  type = EXPR_UNKNOWN;
     int                len = 2;
+    int                type_is = FALSE;
 
     /*
      * Get the first variable.
@@ -2431,44 +2431,7 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
        return FAIL;
 
     p = eval_next_non_blank(*arg, evalarg, &getnext);
-    switch (p[0])
-    {
-       case '=':   if (p[1] == '=')
-                       type = EXPR_EQUAL;
-                   else if (p[1] == '~')
-                       type = EXPR_MATCH;
-                   break;
-       case '!':   if (p[1] == '=')
-                       type = EXPR_NEQUAL;
-                   else if (p[1] == '~')
-                       type = EXPR_NOMATCH;
-                   break;
-       case '>':   if (p[1] != '=')
-                   {
-                       type = EXPR_GREATER;
-                       len = 1;
-                   }
-                   else
-                       type = EXPR_GEQUAL;
-                   break;
-       case '<':   if (p[1] != '=')
-                   {
-                       type = EXPR_SMALLER;
-                       len = 1;
-                   }
-                   else
-                       type = EXPR_SEQUAL;
-                   break;
-       case 'i':   if (p[1] == 's')
-                   {
-                       if (p[2] == 'n' && p[3] == 'o' && p[4] == 't')
-                           len = 5;
-                       i = p[len];
-                       if (!isalnum(i) && i != '_')
-                           type = len == 2 ? EXPR_IS : EXPR_ISNOT;
-                   }
-                   break;
-    }
+    type = get_compare_type(p, &len, &type_is);
 
     /*
      * If there is a comparative operator, use it.
@@ -2482,6 +2445,13 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
        if (getnext)
            *arg = eval_next_line(evalarg);
 
+       if (vim9script && type_is && (p[len] == '?' || p[len] == '#'))
+       {
+           semsg(_(e_invexpr2), p);
+           clear_tv(rettv);
+           return FAIL;
+       }
+
        // extra question mark appended: ignore case
        if (p[len] == '?')
        {
index 4108c04af4eb09aedb7afbc326f2191687590af7..fd2dd1bf4b3393b28319a96c58d4abce5339d988 100644 (file)
@@ -16,6 +16,7 @@ int vim9_comment_start(char_u *p);
 char_u *peek_next_line_from_context(cctx_T *cctx);
 char_u *next_line_from_context(cctx_T *cctx, int skip_comment);
 char_u *to_name_const_end(char_u *arg);
+exptype_T get_compare_type(char_u *p, int *len, int *type_is);
 int assignment_len(char_u *p, int *heredoc);
 void vim9_declare_error(char_u *name);
 int check_vim9_unlet(char_u *name);
index e29ef5cf0e575978b402ec73c221f070e142809f..550e41982636325dc6fde81c65c8287125c3553d 100644 (file)
@@ -831,7 +831,7 @@ def Test_expr5()
 enddef
 
 def Test_expr5_vim9script()
-  # only checks line continuation
+  # check line continuation
   let lines =<< trim END
       vim9script
       let var = 11
@@ -848,6 +848,30 @@ def Test_expr5_vim9script()
       assert_equal('onetwo', var)
   END
   CheckScriptSuccess(lines)
+
+  lines =<< trim END
+      vim9script
+      echo 'abc' is# 'abc'
+  END
+  CheckScriptFailure(lines, 'E15:')
+
+  lines =<< trim END
+      vim9script
+      echo 'abc' is? 'abc'
+  END
+  CheckScriptFailure(lines, 'E15:')
+
+  lines =<< trim END
+      vim9script
+      echo 'abc' isnot# 'abc'
+  END
+  CheckScriptFailure(lines, 'E15:')
+
+  lines =<< trim END
+      vim9script
+      echo 'abc' isnot? 'abc'
+  END
+  CheckScriptFailure(lines, 'E15:')
 enddef
 
 def Test_expr5_float()
index bb1c4ab413c6267a71ec59a7c156090c0a6745fd..033f36072fa0ce12f9d370e4916c408b1a79514f 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1323,
 /**/
     1322,
 /**/
index f1509048e4df1558fa12e15224eee75d355ddd30..cf08e955844135dd2d517832a7213356074e13fa 100644 (file)
@@ -3633,7 +3633,7 @@ get_vim_constant(char_u **arg, typval_T *rettv)
     }
 }
 
-    static exptype_T
+    exptype_T
 get_compare_type(char_u *p, int *len, int *type_is)
 {
     exptype_T  type = EXPR_UNKNOWN;