diff src/eval.c @ 21546:4d3e983313dc v8.2.1323

patch 8.2.1323: Vim9: invalid operators only rejected in :def function Commit: https://github.com/vim/vim/commit/696ba23149eb5a7226e606e3fe6f15fdd064c5f7 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jul 29 21:20:41 2020 +0200 patch 8.2.1323: Vim9: invalid operators only rejected in :def function Problem: Vim9: invalid operators only rejected in :def function. Solution: Also reject them at script level. (closes https://github.com/vim/vim/issues/6564)
author Bram Moolenaar <Bram@vim.org>
date Wed, 29 Jul 2020 21:30:04 +0200
parents 81c47a694479
children cbc570e66d11
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -2420,9 +2420,9 @@ eval4(char_u **arg, typval_T *rettv, eva
 {
     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, eva
 	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, eva
 	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] == '?')
 	{