To: vim_dev@googlegroups.com Subject: Patch 8.2.2320 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2320 Problem: Vim9: no error for comparing bool with string. Solution: Check for wrong types when comparing. (closes #7639) Files: src/typval.c, src/errors.h, src/testdir/test_vim9_expr.vim *** ../vim-8.2.2319/src/typval.c 2021-01-09 15:45:20.353451132 +0100 --- src/typval.c 2021-01-09 16:11:58.094076957 +0100 *************** *** 834,839 **** --- 834,863 ---- default: break; // avoid gcc warning } } + else if (in_vim9script() && (typ1->v_type == VAR_BOOL + || typ2->v_type == VAR_BOOL)) + { + if (typ1->v_type != typ2->v_type) + { + semsg(_(e_cannot_compare_str_with_str), + vartype_name(typ1->v_type), vartype_name(typ2->v_type)); + clear_tv(typ1); + return FAIL; + } + n1 = typ1->vval.v_number; + n2 = typ2->vval.v_number; + switch (type) + { + case EXPR_IS: + case EXPR_EQUAL: n1 = (n1 == n2); break; + case EXPR_ISNOT: + case EXPR_NEQUAL: n1 = (n1 != n2); break; + default: + emsg(_(e_invalid_operation_for_bool)); + clear_tv(typ1); + return FAIL; + } + } else { s1 = tv_get_string_buf(typ1, buf1); *** ../vim-8.2.2319/src/errors.h 2021-01-04 16:15:55.066084896 +0100 --- src/errors.h 2021-01-09 16:09:10.578539104 +0100 *************** *** 341,343 **** --- 341,345 ---- INIT(= N_("E1151: Mismatched endfunction")); EXTERN char e_mismatched_enddef[] INIT(= N_("E1152: Mismatched enddef")); + EXTERN char e_invalid_operation_for_bool[] + INIT(= N_("E1153: Invalid operation for bool")); *** ../vim-8.2.2319/src/testdir/test_vim9_expr.vim 2021-01-09 13:20:32.200472552 +0100 --- src/testdir/test_vim9_expr.vim 2021-01-09 16:16:05.161384252 +0100 *************** *** 597,602 **** --- 597,614 ---- CheckDefFailure(["var x = 'a' == "], 'E1097:', 3) CheckDefExecFailure(['var items: any', 'eval 1', 'eval 2', 'if items == []', 'endif'], 'E691:', 4) + + CheckDefExecFailure(['var x: any = "a"', 'echo x == true'], 'E1072: Cannot compare string with bool', 2) + CheckDefExecFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2) + CheckDefExecFailure(["var x: any = 99", 'echo x == true'], 'E1138', 2) + CheckDefExecFailure(["var x: any = 'a'", 'echo x == 99'], 'E1030:', 2) + + for op in ['>', '>=', '<', '<=', '=~', '!~'] + CheckDefExecFailure([ + "var a: any = 'a'", + 'var b: any = true', + 'echo a ' .. op .. ' b'], 'E1072:', 3) + endfor enddef " test != comperator *** ../vim-8.2.2319/src/version.c 2021-01-09 15:45:20.353451132 +0100 --- src/version.c 2021-01-09 16:17:52.645079894 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2320, /**/ -- Support your right to bare arms! Wear short sleeves! /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///