1
0
forked from aniani/vim

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)
This commit is contained in:
Bram Moolenaar
2020-07-29 21:20:41 +02:00
parent 1040956292
commit 696ba23149
5 changed files with 38 additions and 41 deletions

View File

@@ -2420,9 +2420,9 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
{ {
char_u *p; char_u *p;
int getnext; int getnext;
int i;
exptype_T type = EXPR_UNKNOWN; exptype_T type = EXPR_UNKNOWN;
int len = 2; int len = 2;
int type_is = FALSE;
/* /*
* Get the first variable. * Get the first variable.
@@ -2431,44 +2431,7 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
return FAIL; return FAIL;
p = eval_next_non_blank(*arg, evalarg, &getnext); p = eval_next_non_blank(*arg, evalarg, &getnext);
switch (p[0]) type = get_compare_type(p, &len, &type_is);
{
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;
}
/* /*
* If there is a comparative operator, use it. * If there is a comparative operator, use it.
@@ -2482,6 +2445,13 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
if (getnext) if (getnext)
*arg = eval_next_line(evalarg); *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 // extra question mark appended: ignore case
if (p[len] == '?') if (p[len] == '?')
{ {

View File

@@ -16,6 +16,7 @@ int vim9_comment_start(char_u *p);
char_u *peek_next_line_from_context(cctx_T *cctx); char_u *peek_next_line_from_context(cctx_T *cctx);
char_u *next_line_from_context(cctx_T *cctx, int skip_comment); char_u *next_line_from_context(cctx_T *cctx, int skip_comment);
char_u *to_name_const_end(char_u *arg); 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); int assignment_len(char_u *p, int *heredoc);
void vim9_declare_error(char_u *name); void vim9_declare_error(char_u *name);
int check_vim9_unlet(char_u *name); int check_vim9_unlet(char_u *name);

View File

@@ -831,7 +831,7 @@ def Test_expr5()
enddef enddef
def Test_expr5_vim9script() def Test_expr5_vim9script()
# only checks line continuation # check line continuation
let lines =<< trim END let lines =<< trim END
vim9script vim9script
let var = 11 let var = 11
@@ -848,6 +848,30 @@ def Test_expr5_vim9script()
assert_equal('onetwo', var) assert_equal('onetwo', var)
END END
CheckScriptSuccess(lines) 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 enddef
def Test_expr5_float() def Test_expr5_float()

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1323,
/**/ /**/
1322, 1322,
/**/ /**/

View 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) get_compare_type(char_u *p, int *len, int *type_is)
{ {
exptype_T type = EXPR_UNKNOWN; exptype_T type = EXPR_UNKNOWN;