# HG changeset patch # User Bram Moolenaar # Date 1581970505 -3600 # Node ID f3e8e74cb7472a60fdb5847429d9784ca05a8e42 # Parent e5cd953790bec057abb4ebaeb84f8b70a8492556 patch 8.2.0269: Vim9: operator after list index does not work Commit: https://github.com/vim/vim/commit/b13af50f73dd89503c915f76fcf92be58789521a Author: Bram Moolenaar Date: Mon Feb 17 21:12:08 2020 +0100 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -743,6 +743,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 269, +/**/ 268, /**/ 267, diff --git a/src/vim9compile.c b/src/vim9compile.c --- 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] != '.') {