From: Bram Moolenaar Date: Mon, 17 Feb 2020 20:12:08 +0000 (+0100) Subject: patch 8.2.0269: Vim9: operator after list index does not work X-Git-Tag: v8.2.0269 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b13af50f73dd89503c915f76fcf92be58789521a;p=vim patch 8.2.0269: Vim9: operator after list index does not work Problem: Vim9: operator after list index does not work. (Yasuhiro Matsumoto) Solution: After indexing a list change the type to the list member type. (closes #5651) --- diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index 1ff713126..c0767f517 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -478,6 +478,17 @@ def Test_expr6() assert_equal(2, g:anint % g:alsoint) assert_equal(4, 6 * 4 / 6) + + let x = [2] + let y = [3] + assert_equal(5, x[0] + y[0]) + assert_equal(6, x[0] * y[0]) + if has('float') + let xf = [2.0] + let yf = [3.0] + assert_equal(5.0, xf[0] + yf[0]) + assert_equal(6.0, xf[0] * yf[0]) + endif enddef def Test_expr6_float() @@ -538,6 +549,10 @@ func Test_expr6_fails() call CheckDefFailure("let x = #{one: 1} / #{two: 2}", 'E1036:') call CheckDefFailure("let x = #{one: 1} % #{two: 2}", 'E1035:') + call CheckDefFailure("let x = 0xff[1]", 'E714:') + if has('float') + call CheckDefFailure("let x = 0.7[1]", 'E714:') + endif endfunc func Test_expr6_float_fails() diff --git a/src/version.c b/src/version.c index afac47d7e..4ea036744 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 269, /**/ 268, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index a4b5a92f0..adfcbcc8f 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -2330,6 +2330,9 @@ compile_subscript( } else if (**arg == '[') { + garray_T *stack; + type_T **typep; + // list index: list[123] // TODO: more arguments // TODO: dict member dict['name'] @@ -2346,6 +2349,14 @@ compile_subscript( if (generate_instr_drop(cctx, ISN_INDEX, 1) == FAIL) return FAIL; + stack = &cctx->ctx_type_stack; + typep = ((type_T **)stack->ga_data) + stack->ga_len - 1; + if ((*typep)->tt_type != VAR_LIST && *typep != &t_any) + { + emsg(_(e_listreq)); + return FAIL; + } + *typep = (*typep)->tt_member; } else if (**arg == '.' && (*arg)[1] != '.') {