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 #6564)
diff --git a/src/eval.c b/src/eval.c
index 81913c7..451bb16 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2420,9 +2420,9 @@
{
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 @@
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 @@
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] == '?')
{