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:
48
src/eval.c
48
src/eval.c
@@ -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] == '?')
|
||||||
{
|
{
|
||||||
|
@@ -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);
|
||||||
|
@@ -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()
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user