forked from aniani/vim
patch 8.2.2145: Vim9: concatenating lists does not adjust type of result
Problem: Vim9: concatenating lists does not adjust type of result. Solution: When list member types differ use "any" member type. (closes #7473)
This commit is contained in:
parent
025cb1ca86
commit
399ea8108c
@ -1317,6 +1317,23 @@ func Test_expr5_fails_channel()
|
|||||||
call CheckDefFailure(["var x = 'a' .. test_null_channel()"], 'E1105:', 1)
|
call CheckDefFailure(["var x = 'a' .. test_null_channel()"], 'E1105:', 1)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
def Test_expr5_list_add()
|
||||||
|
# concatenating two lists with same member types is OK
|
||||||
|
var d = {}
|
||||||
|
for i in ['a'] + ['b']
|
||||||
|
d = {[i]: 0}
|
||||||
|
endfor
|
||||||
|
|
||||||
|
# concatenating two lists with different member types results in "any"
|
||||||
|
var lines =<< trim END
|
||||||
|
var d = {}
|
||||||
|
for i in ['a'] + [0]
|
||||||
|
d = {[i]: 0}
|
||||||
|
endfor
|
||||||
|
END
|
||||||
|
CheckDefExecFailure(lines, 'E1012:')
|
||||||
|
enddef
|
||||||
|
|
||||||
" test multiply, divide, modulo
|
" test multiply, divide, modulo
|
||||||
def Test_expr6()
|
def Test_expr6()
|
||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
|
@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
2145,
|
||||||
/**/
|
/**/
|
||||||
2144,
|
2144,
|
||||||
/**/
|
/**/
|
||||||
|
@ -538,14 +538,15 @@ generate_add_instr(
|
|||||||
type_T *type1,
|
type_T *type1,
|
||||||
type_T *type2)
|
type_T *type2)
|
||||||
{
|
{
|
||||||
isn_T *isn = generate_instr_drop(cctx,
|
garray_T *stack = &cctx->ctx_type_stack;
|
||||||
vartype == VAR_NUMBER ? ISN_OPNR
|
isn_T *isn = generate_instr_drop(cctx,
|
||||||
: vartype == VAR_LIST ? ISN_ADDLIST
|
vartype == VAR_NUMBER ? ISN_OPNR
|
||||||
: vartype == VAR_BLOB ? ISN_ADDBLOB
|
: vartype == VAR_LIST ? ISN_ADDLIST
|
||||||
|
: vartype == VAR_BLOB ? ISN_ADDBLOB
|
||||||
#ifdef FEAT_FLOAT
|
#ifdef FEAT_FLOAT
|
||||||
: vartype == VAR_FLOAT ? ISN_OPFLOAT
|
: vartype == VAR_FLOAT ? ISN_OPFLOAT
|
||||||
#endif
|
#endif
|
||||||
: ISN_OPANY, 1);
|
: ISN_OPANY, 1);
|
||||||
|
|
||||||
if (vartype != VAR_LIST && vartype != VAR_BLOB
|
if (vartype != VAR_LIST && vartype != VAR_BLOB
|
||||||
&& type1->tt_type != VAR_ANY
|
&& type1->tt_type != VAR_ANY
|
||||||
@ -556,6 +557,14 @@ generate_add_instr(
|
|||||||
|
|
||||||
if (isn != NULL)
|
if (isn != NULL)
|
||||||
isn->isn_arg.op.op_type = EXPR_ADD;
|
isn->isn_arg.op.op_type = EXPR_ADD;
|
||||||
|
|
||||||
|
// When concatenating two lists with different member types the member type
|
||||||
|
// becomes "any".
|
||||||
|
if (vartype == VAR_LIST
|
||||||
|
&& type1->tt_type == VAR_LIST && type2->tt_type == VAR_LIST
|
||||||
|
&& type1->tt_member != type2->tt_member)
|
||||||
|
(((type_T **)stack->ga_data)[stack->ga_len - 1]) = &t_list_any;
|
||||||
|
|
||||||
return isn == NULL ? FAIL : OK;
|
return isn == NULL ? FAIL : OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7172,6 +7181,7 @@ compile_put(char_u *arg, exarg_T *eap, cctx_T *cctx)
|
|||||||
// Either no range or a number.
|
// Either no range or a number.
|
||||||
// "errormsg" will not be set because the range is ADDR_LINES.
|
// "errormsg" will not be set because the range is ADDR_LINES.
|
||||||
if (parse_cmd_address(eap, &errormsg, FALSE) == FAIL)
|
if (parse_cmd_address(eap, &errormsg, FALSE) == FAIL)
|
||||||
|
// cannot happen
|
||||||
return NULL;
|
return NULL;
|
||||||
if (eap->addr_count == 0)
|
if (eap->addr_count == 0)
|
||||||
lnum = -1;
|
lnum = -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user