To: vim_dev@googlegroups.com Subject: Patch 8.2.3353 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3353 Problem: Vim9: type of argument for negate not checked at compile time. Solution: Add a compile time check. Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim, src/testdir/test_vim9_disassemble.vim *** ../vim-8.2.3352/src/vim9compile.c 2021-08-13 19:40:47.417028286 +0200 --- src/vim9compile.c 2021-08-15 19:43:30.345191256 +0200 *************** *** 4210,4219 **** --p; if (*p == '-' || *p == '+') { ! int negate = *p == '-'; ! isn_T *isn; - // TODO: check type while (p > start && (p[-1] == '-' || p[-1] == '+')) { --p; --- 4210,4224 ---- --p; if (*p == '-' || *p == '+') { ! int negate = *p == '-'; ! isn_T *isn; ! garray_T *stack = &cctx->ctx_type_stack; ! type_T *type; ! ! type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; ! if (need_type(type, &t_number, -1, 0, cctx, FALSE, FALSE) == FAIL) ! return FAIL; while (p > start && (p[-1] == '-' || p[-1] == '+')) { --p; *************** *** 4222,4232 **** } // only '-' has an effect, for '+' we only check the type if (negate) isn = generate_instr(cctx, ISN_NEGATENR); ! else ! isn = generate_instr(cctx, ISN_CHECKNR); ! if (isn == NULL) ! return FAIL; } else if (numeric_only) { --- 4227,4237 ---- } // only '-' has an effect, for '+' we only check the type if (negate) + { isn = generate_instr(cctx, ISN_NEGATENR); ! if (isn == NULL) ! return FAIL; ! } } else if (numeric_only) { *************** *** 5809,5815 **** goto theend; r = generate_STORE(cctx, ISN_STORE, lvar->lv_idx, NULL); } - // TODO: warning for trailing text? theend: vim_free(lambda_name); --- 5814,5819 ---- *************** *** 5852,5858 **** switch (dest) { case dest_option: - // TODO: check the option exists generate_LOAD(cctx, ISN_LOADOPT, 0, name, type); break; case dest_global: --- 5856,5861 ---- *** ../vim-8.2.3352/src/testdir/test_vim9_expr.vim 2021-08-07 17:20:07.966856597 +0200 --- src/testdir/test_vim9_expr.vim 2021-08-15 19:51:22.050632751 +0200 *************** *** 3123,3128 **** --- 3123,3139 ---- CheckDefAndScriptSuccess(lines) enddef + let g:anumber = 42 + + def Test_expr7_negate() + var lines =<< trim END + var nr = 1 + assert_equal(-1, -nr) + assert_equal(-42, -g:anumber) + END + CheckDefAndScriptSuccess(lines) + enddef + func Test_expr7_fails() call CheckDefFailure(["var x = (12"], "E1097:", 3) call CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2) *************** *** 3130,3137 **** call CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1) call CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1) call CheckDefAndScriptFailure(["var x = -0z12"], "E974:", 1) ! call CheckDefExecAndScriptFailure2(["var x = -[8]"], "E39:", 'E745:', 1) ! call CheckDefExecAndScriptFailure2(["var x = -{a: 1}"], "E39:", 'E728:', 1) call CheckDefAndScriptFailure(["var x = @"], "E1002:", 1) call CheckDefAndScriptFailure(["var x = @<"], "E354:", 1) --- 3141,3148 ---- call CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1) call CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1) call CheckDefAndScriptFailure(["var x = -0z12"], "E974:", 1) ! call CheckDefExecAndScriptFailure2(["var x = -[8]"], "E1012:", 'E745:', 1) ! call CheckDefExecAndScriptFailure2(["var x = -{a: 1}"], "E1012:", 'E728:', 1) call CheckDefAndScriptFailure(["var x = @"], "E1002:", 1) call CheckDefAndScriptFailure(["var x = @<"], "E354:", 1) *************** *** 3154,3163 **** call CheckDefAndScriptFailure2(["echo l:somevar"], 'E1075:', 'E121:', 1) call CheckDefAndScriptFailure2(["echo x:somevar"], 'E1075:', 'E121:', 1) ! call CheckDefExecAndScriptFailure(["var x = +g:astring"], 'E1030:', 1) ! call CheckDefExecAndScriptFailure(["var x = +g:ablob"], 'E974:', 1) ! call CheckDefExecAndScriptFailure(["var x = +g:alist"], 'E745:', 1) ! call CheckDefExecAndScriptFailure(["var x = +g:adict"], 'E728:', 1) call CheckDefAndScriptFailure2(["var x = ''", "var y = x.memb"], 'E1229: Expected dictionary for using key "memb", but got string', 'E488:', 2) --- 3165,3174 ---- call CheckDefAndScriptFailure2(["echo l:somevar"], 'E1075:', 'E121:', 1) call CheckDefAndScriptFailure2(["echo x:somevar"], 'E1075:', 'E121:', 1) ! call CheckDefExecAndScriptFailure2(["var x = +g:astring"], 'E1012:', 'E1030:', 1) ! call CheckDefExecAndScriptFailure2(["var x = +g:ablob"], 'E1012:', 'E974:', 1) ! call CheckDefExecAndScriptFailure2(["var x = +g:alist"], 'E1012:', 'E745:', 1) ! call CheckDefExecAndScriptFailure2(["var x = +g:adict"], 'E1012:', 'E728:', 1) call CheckDefAndScriptFailure2(["var x = ''", "var y = x.memb"], 'E1229: Expected dictionary for using key "memb", but got string', 'E488:', 2) *** ../vim-8.2.3352/src/testdir/test_vim9_script.vim 2021-08-07 18:12:35.495528716 +0200 --- src/testdir/test_vim9_script.vim 2021-08-15 20:06:34.043106304 +0200 *************** *** 469,489 **** try n = -g:astring ! catch /E39:/ n = 233 endtry assert_equal(233, n) try n = +g:astring ! catch /E1030:/ n = 244 endtry assert_equal(244, n) try n = +g:alist ! catch /E745:/ n = 255 endtry assert_equal(255, n) --- 469,489 ---- try n = -g:astring ! catch /E1012:/ n = 233 endtry assert_equal(233, n) try n = +g:astring ! catch /E1012:/ n = 244 endtry assert_equal(244, n) try n = +g:alist ! catch /E1012:/ n = 255 endtry assert_equal(255, n) *** ../vim-8.2.3352/src/testdir/test_vim9_disassemble.vim 2021-08-13 19:40:47.417028286 +0200 --- src/testdir/test_vim9_disassemble.vim 2021-08-15 20:34:59.847469119 +0200 *************** *** 1680,1704 **** enddef def NegateNumber(): number ! var nr = 9 ! var plus = +nr ! var res = -nr ! return res enddef def Test_disassemble_negate_number() var instr = execute('disassemble NegateNumber') assert_match('NegateNumber\_s*' .. ! 'var nr = 9\_s*' .. ! '\d STORE 9 in $0\_s*' .. ! 'var plus = +nr\_s*' .. ! '\d LOAD $0\_s*' .. ! '\d CHECKNR\_s*' .. ! '\d STORE $1\_s*' .. ! 'var res = -nr\_s*' .. ! '\d LOAD $0\_s*' .. '\d NEGATENR\_s*' .. ! '\d STORE $2\_s*', instr) assert_equal(-9, NegateNumber()) enddef --- 1680,1706 ---- enddef def NegateNumber(): number ! g:nr = 9 ! var plus = +g:nr ! var minus = -g:nr ! return minus enddef def Test_disassemble_negate_number() var instr = execute('disassemble NegateNumber') assert_match('NegateNumber\_s*' .. ! 'g:nr = 9\_s*' .. ! '\d PUSHNR 9\_s*' .. ! '\d STOREG g:nr\_s*' .. ! 'var plus = +g:nr\_s*' .. ! '\d LOADG g:nr\_s*' .. ! '\d CHECKTYPE number stack\[-1\]\_s*' .. ! '\d STORE $0\_s*' .. ! 'var minus = -g:nr\_s*' .. ! '\d LOADG g:nr\_s*' .. ! '\d CHECKTYPE number stack\[-1\]\_s*' .. '\d NEGATENR\_s*' .. ! '\d STORE $1\_s*', instr) assert_equal(-9, NegateNumber()) enddef *** ../vim-8.2.3352/src/version.c 2021-08-15 19:28:01.808558478 +0200 --- src/version.c 2021-08-15 19:45:04.356599861 +0200 *************** *** 757,758 **** --- 757,760 ---- { /* Add new patch number below this line */ + /**/ + 3353, /**/ -- John: When I'm playing tennis with friends I always get carried away George: You hurt your foot each time? /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///