To: vim_dev@googlegroups.com Subject: Patch 8.2.3415 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3415 Problem: Vim9: Not all function argument types are properly checked. Solution: Add and improve argument type checks. (Yegappan Lakshmanan, closes #8839) Files: src/channel.c, src/digraph.c, src/evalfunc.c, src/terminal.c, src/testdir/test_digraph.vim, src/testdir/test_vim9_builtin.vim *** ../vim-8.2.3414/src/channel.c 2021-08-09 19:59:01.438811254 +0200 --- src/channel.c 2021-09-08 14:54:44.261600968 +0200 *************** *** 1309,1315 **** if (in_vim9script() && (check_for_string_arg(argvars, 0) == FAIL ! || check_for_dict_arg(argvars, 1) == FAIL)) return NULL; address = tv_get_string(&argvars[0]); --- 1309,1315 ---- if (in_vim9script() && (check_for_string_arg(argvars, 0) == FAIL ! || check_for_opt_dict_arg(argvars, 1) == FAIL)) return NULL; address = tv_get_string(&argvars[0]); *** ../vim-8.2.3414/src/digraph.c 2021-08-09 19:59:01.438811254 +0200 --- src/digraph.c 2021-09-08 14:54:44.265600957 +0200 *************** *** 2443,2449 **** # ifdef FEAT_DIGRAPHS int flag_list_all; ! if (in_vim9script() && check_for_opt_number_arg(argvars, 0) == FAIL) return; if (argvars[0].v_type == VAR_UNKNOWN) --- 2443,2449 ---- # ifdef FEAT_DIGRAPHS int flag_list_all; ! if (in_vim9script() && check_for_opt_bool_arg(argvars, 0) == FAIL) return; if (argvars[0].v_type == VAR_UNKNOWN) *************** *** 2475,2481 **** if (in_vim9script() && (check_for_string_arg(argvars, 0) == FAIL ! || check_for_number_arg(argvars, 1) == FAIL)) return; if (!digraph_set_common(&argvars[0], &argvars[1])) --- 2475,2481 ---- if (in_vim9script() && (check_for_string_arg(argvars, 0) == FAIL ! || check_for_string_arg(argvars, 1) == FAIL)) return; if (!digraph_set_common(&argvars[0], &argvars[1])) *** ../vim-8.2.3414/src/evalfunc.c 2021-09-04 14:49:52.467212124 +0200 --- src/evalfunc.c 2021-09-08 14:54:44.265600957 +0200 *************** *** 1305,1313 **** ret_number, f_diff_hlID}, {"digraph_get", 1, 1, FEARG_1, arg1_string, ret_string, f_digraph_get}, ! {"digraph_getlist",0, 1, FEARG_1, arg1_number, ret_list_string_items, f_digraph_getlist}, ! {"digraph_set", 2, 2, FEARG_1, arg2_string_number, ret_bool, f_digraph_set}, {"digraph_setlist",1, 1, FEARG_1, arg1_list_string, ret_bool, f_digraph_setlist}, --- 1305,1313 ---- ret_number, f_diff_hlID}, {"digraph_get", 1, 1, FEARG_1, arg1_string, ret_string, f_digraph_get}, ! {"digraph_getlist",0, 1, FEARG_1, arg1_bool, ret_list_string_items, f_digraph_getlist}, ! {"digraph_set", 2, 2, FEARG_1, arg2_string, ret_bool, f_digraph_set}, {"digraph_setlist",1, 1, FEARG_1, arg1_list_string, ret_bool, f_digraph_setlist}, *************** *** 2954,2961 **** error = TRUE; if (argvars[1].v_type != VAR_UNKNOWN) { - if (in_vim9script() && check_for_string_arg(argvars, 1) == FAIL) - return; buttons = tv_get_string_buf_chk(&argvars[1], buf); if (buttons == NULL) error = TRUE; --- 2954,2959 ---- *************** *** 2964,2971 **** def = (int)tv_get_number_chk(&argvars[2], &error); if (argvars[3].v_type != VAR_UNKNOWN) { - if (in_vim9script() && check_for_string_arg(argvars, 3) == FAIL) - return; typestr = tv_get_string_buf_chk(&argvars[3], buf2); if (typestr == NULL) error = TRUE; --- 2962,2967 ---- *** ../vim-8.2.3414/src/terminal.c 2021-07-27 22:00:39.753712380 +0200 --- src/terminal.c 2021-09-08 14:54:44.265600957 +0200 *************** *** 5663,5669 **** { if (in_vim9script() && (check_for_string_arg(argvars, 0) == FAIL ! || check_for_dict_arg(argvars, 1) == FAIL)) return; term_load_dump(argvars, rettv, FALSE); --- 5663,5669 ---- { if (in_vim9script() && (check_for_string_arg(argvars, 0) == FAIL ! || check_for_opt_dict_arg(argvars, 1) == FAIL)) return; term_load_dump(argvars, rettv, FALSE); *** ../vim-8.2.3414/src/testdir/test_digraph.vim 2021-08-10 21:39:17.041820459 +0200 --- src/testdir/test_digraph.vim 2021-09-08 14:54:44.265600957 +0200 *************** *** 536,541 **** --- 536,543 ---- call assert_fails('call digraph_set("あ", "あ")', 'E1214: Digraph must be just two characters: あ') call assert_fails('call digraph_set("aa", "ああ")', 'E1215: Digraph must be one character: ああ') call assert_fails('call digraph_set("aa", "か" .. nr2char(0x3099))', 'E1215: Digraph must be one character: か' .. nr2char(0x3099)) + call assert_fails('call digraph_set(test_null_string(), "い")', 'E1214: Digraph must be just two characters') + call assert_fails('call digraph_set("aa", 0z10)', 'E976: Using a Blob as a String') bwipe! endfunc *************** *** 553,558 **** --- 555,562 ---- call assert_equal('う', digraph_get(' ')) call assert_fails('call digraph_get("aaa")', 'E1214: Digraph must be just two characters: aaa') call assert_fails('call digraph_get("b")', 'E1214: Digraph must be just two characters: b') + call assert_fails('call digraph_get(test_null_string())', 'E1214: Digraph must be just two characters:') + call assert_fails('call digraph_get(0z10)', 'E976: Using a Blob as a String') endfunc func Test_digraph_get_function_encode() *************** *** 576,583 **** call assert_equal('く', digraph_get('bb')) call assert_fails('call digraph_setlist([[]])', 'E1216:') ! call assert_fails('call digraph_setlist([["aa", "b", "cc"]])', '1216:') call assert_fails('call digraph_setlist([["あ", "あ"]])', 'E1214: Digraph must be just two characters: あ') endfunc func Test_digraph_getlist_function() --- 580,591 ---- call assert_equal('く', digraph_get('bb')) call assert_fails('call digraph_setlist([[]])', 'E1216:') ! call assert_fails('call digraph_setlist([["aa", "b", "cc"]])', 'E1216:') call assert_fails('call digraph_setlist([["あ", "あ"]])', 'E1214: Digraph must be just two characters: あ') + call assert_fails('call digraph_setlist([test_null_list()])', 'E1216:') + call assert_fails('call digraph_setlist({})', 'E1216:') + call assert_fails('call digraph_setlist([{}])', 'E1216:') + call assert_true(digraph_setlist(test_null_list())) endfunc func Test_digraph_getlist_function() *************** *** 592,597 **** --- 600,607 ---- " of digraphs returned. call assert_equal(digraph_getlist()->len(), digraph_getlist(0)->len()) call assert_notequal((digraph_getlist()->len()), digraph_getlist(1)->len()) + + call assert_fails('call digraph_getlist(0z12)', 'E974: Using a Blob as a Number') endfunc *** ../vim-8.2.3414/src/testdir/test_vim9_builtin.vim 2021-09-04 14:49:52.467212124 +0200 --- src/testdir/test_vim9_builtin.vim 2021-09-08 14:54:44.265600957 +0200 *************** *** 181,186 **** --- 181,187 ---- append(0, function('min')) assert_equal("function('min')", getline(1)) CheckDefAndScriptFailure2(['append([1], "x")'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['append("", "x")'], 'E1209: Invalid value for a line number') bwipe! enddef *************** *** 308,313 **** --- 309,315 ---- def Test_bufexists() assert_fails('bufexists(true)', 'E1220:') + bufexists('')->assert_false() enddef def Test_buflisted() *************** *** 315,320 **** --- 317,323 ---- assert_equal(false, res) assert_fails('buflisted(true)', 'E1220:') assert_fails('buflisted([])', 'E1220:') + buflisted('')->assert_false() enddef def Test_bufload() *************** *** 324,329 **** --- 327,333 ---- def Test_bufloaded() assert_fails('bufloaded(true)', 'E1220:') assert_fails('bufloaded([])', 'E1220:') + bufloaded('')->assert_false() enddef def Test_bufname() *************** *** 490,495 **** --- 494,500 ---- else CheckDefAndScriptFailure2(['ch_open({"a": 10}, "a")'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['ch_open("a", [1])'], 'E1013: Argument 2: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 2') + CheckDefExecAndScriptFailure(['ch_open("")'], 'E475: Invalid argument') endif enddef *************** *** 576,581 **** --- 581,587 ---- def Test_charcol() CheckDefAndScriptFailure2(['charcol(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1222: String or List required for argument 1') CheckDefAndScriptFailure2(['charcol({a: 10})'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1222: String or List required for argument 1') + CheckDefExecAndScriptFailure(['charcol("")'], 'E1209: Invalid value for a line number') new setline(1, ['abcdefgh']) cursor(1, 4) *************** *** 598,603 **** --- 604,610 ---- def Test_cindent() CheckDefAndScriptFailure2(['cindent([])'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['cindent(null)'], 'E1013: Argument 1: type mismatch, expected string but got special', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['cindent("")'], 'E1209: Invalid value for a line number') assert_equal(-1, cindent(0)) assert_equal(0, cindent('.')) enddef *************** *** 619,624 **** --- 626,632 ---- CheckDefAndScriptFailure2(['col(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1222: String or List required for argument 1') CheckDefAndScriptFailure2(['col({a: 10})'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1222: String or List required for argument 1') CheckDefAndScriptFailure2(['col(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1222: String or List required for argument 1') + CheckDefExecAndScriptFailure(['col("")'], 'E1209: Invalid value for a line number') bw! enddef *************** *** 706,711 **** --- 714,720 ---- CheckDefAndScriptFailure2(['cursor(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected number but got blob', 'E1224: String, Number or List required for argument 1') CheckDefAndScriptFailure2(['cursor(1, "2")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') CheckDefAndScriptFailure2(['cursor(1, 2, "3")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3') + CheckDefExecAndScriptFailure(['cursor("", 2)'], 'E1209: Invalid value for a line number') enddef def Test_debugbreak() *************** *** 723,728 **** --- 732,738 ---- CheckDefAndScriptFailure2(['delete(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['delete("a", 10)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') + CheckDefExecAndScriptFailure(['delete("")'], 'E474: Invalid argument') enddef def Test_deletebufline() *************** *** 734,739 **** --- 744,750 ---- def Test_diff_filler() CheckDefAndScriptFailure2(['diff_filler([])'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['diff_filler(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['diff_filler("")'], 'E1209: Invalid value for a line number') assert_equal(0, diff_filler(1)) assert_equal(0, diff_filler('.')) enddef *************** *** 741,746 **** --- 752,779 ---- def Test_diff_hlID() CheckDefAndScriptFailure2(['diff_hlID(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['diff_hlID(1, "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') + CheckDefExecAndScriptFailure(['diff_hlID("", 10)'], 'E1209: Invalid value for a line number') + enddef + + def Test_digraph_get() + CheckDefAndScriptFailure2(['digraph_get(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') + CheckDefExecAndScriptFailure(['digraph_get("")'], 'E1214: Digraph must be just two characters') + enddef + + def Test_digraph_getlist() + CheckDefAndScriptFailure2(['digraph_getlist(10)'], 'E1013: Argument 1: type mismatch, expected bool but got number', 'E1212: Bool required for argument 1') + CheckDefAndScriptFailure2(['digraph_getlist("")'], 'E1013: Argument 1: type mismatch, expected bool but got string', 'E1212: Bool required for argument 1') + enddef + + def Test_digraph_set() + CheckDefAndScriptFailure2(['digraph_set(10, "a")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') + CheckDefAndScriptFailure2(['digraph_set("ab", 0z10)'], 'E1013: Argument 2: type mismatch, expected string but got blob', 'E1174: String required for argument 2') + CheckDefExecAndScriptFailure(['digraph_set("", "a")'], 'E1214: Digraph must be just two characters') + enddef + + def Test_digraph_setlist() + CheckDefAndScriptFailure2(['digraph_setlist("a")'], 'E1013: Argument 1: type mismatch, expected list but got string', 'E1216: digraph_setlist() argument must be a list of lists with two items') + CheckDefAndScriptFailure2(['digraph_setlist({})'], 'E1013: Argument 1: type mismatch, expected list but got dict', 'E1216: digraph_setlist() argument must be a list of lists with two items') enddef def Test_echoraw() *************** *** 758,763 **** --- 791,797 ---- def Test_eval() CheckDefAndScriptFailure2(['eval(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['eval(null)'], 'E1013: Argument 1: type mismatch, expected string but got special', 'E1174: String required for argument 1') + CheckDefExecAndScriptFailure(['eval("")'], 'E15: Invalid expression') assert_equal(2, eval('1 + 1')) enddef *************** *** 1181,1204 **** --- 1215,1242 ---- def Test_foldclosed() CheckDefAndScriptFailure2(['foldclosed(function("min"))'], 'E1013: Argument 1: type mismatch, expected string but got func(...): any', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['foldclosed("")'], 'E1209: Invalid value for a line number') assert_equal(-1, foldclosed(1)) assert_equal(-1, foldclosed('$')) enddef def Test_foldclosedend() CheckDefAndScriptFailure2(['foldclosedend(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['foldclosedend("")'], 'E1209: Invalid value for a line number') assert_equal(-1, foldclosedend(1)) assert_equal(-1, foldclosedend('w0')) enddef def Test_foldlevel() CheckDefAndScriptFailure2(['foldlevel(0z10)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['foldlevel("")'], 'E1209: Invalid value for a line number') assert_equal(0, foldlevel(1)) assert_equal(0, foldlevel('.')) enddef def Test_foldtextresult() CheckDefAndScriptFailure2(['foldtextresult(1.1)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['foldtextresult("")'], 'E1209: Invalid value for a line number') assert_equal('', foldtextresult(1)) assert_equal('', foldtextresult('.')) enddef *************** *** 1320,1325 **** --- 1358,1364 ---- def Test_getcharpos() CheckDefAndScriptFailure2(['getcharpos(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['getcharpos(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') + CheckDefExecAndScriptFailure(['getcharpos("")'], 'E1209: Invalid value for a line number') enddef def Test_getcharstr() *************** *** 1335,1344 **** CheckDefAndScriptFailure2(['getcompletion(1, "b")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['getcompletion("a", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') CheckDefAndScriptFailure2(['getcompletion("a", "b", 2)'], 'E1013: Argument 3: type mismatch, expected bool but got number', 'E1212: Bool required for argument 3') enddef def Test_getcurpos() ! CheckDefAndScriptFailure2(['getcursorcharpos("x")'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1') enddef def Test_getcursorcharpos() --- 1374,1385 ---- CheckDefAndScriptFailure2(['getcompletion(1, "b")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['getcompletion("a", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') CheckDefAndScriptFailure2(['getcompletion("a", "b", 2)'], 'E1013: Argument 3: type mismatch, expected bool but got number', 'E1212: Bool required for argument 3') + CheckDefExecAndScriptFailure(['getcompletion("a", "")'], 'E475: Invalid argument') + getcompletion('', 'messages')->assert_equal(['clear']) enddef def Test_getcurpos() ! CheckDefAndScriptFailure2(['getcurpos("x")'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1') enddef def Test_getcursorcharpos() *************** *** 1425,1430 **** --- 1466,1472 ---- CheckDefExecAndScriptFailure(lines, 'E1209:') CheckDefAndScriptFailure2(['getline(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['getline(1, true)'], 'E1013: Argument 2: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 2') + CheckDefExecAndScriptFailure(['getline("")'], 'E1209: Invalid value for a line number') enddef def Test_getloclist() *************** *** 1454,1459 **** --- 1496,1502 ---- CheckDefAndScriptFailure2(['getpos(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') assert_equal([0, 1, 1, 0], getpos('.')) CheckDefExecFailure(['getpos("a")'], 'E1209:') + CheckDefExecAndScriptFailure(['getpos("")'], 'E1209: Invalid value for a line number') enddef def Test_getqflist() *************** *** 1520,1525 **** --- 1563,1569 ---- def Test_gettext() CheckDefAndScriptFailure2(['gettext(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') + CheckDefExecAndScriptFailure(['gettext("")'], 'E475: Invalid argument') assert_equal('abc', gettext("abc")) enddef *************** *** 1596,1606 **** --- 1640,1652 ---- CheckDefAndScriptFailure2(['histadd(":", 10)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') histadd("search", 'skyblue') assert_equal('skyblue', histget('/', -1)) + histadd("search", '')->assert_equal(0) enddef def Test_histdel() CheckDefAndScriptFailure2(['histdel(1, "x")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['histdel(":", true)'], 'E1013: Argument 2: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 2') + histdel('search', '')->assert_equal(0) enddef def Test_histget() *************** *** 1633,1638 **** --- 1679,1685 ---- def Test_indent() CheckDefAndScriptFailure2(['indent([1])'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['indent(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['indent("")'], 'E1209: Invalid value for a line number') assert_equal(0, indent(1)) enddef *************** *** 1852,1867 **** --- 1899,1917 ---- assert_fails('line(true)', 'E1174:') CheckDefAndScriptFailure2(['line(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['line(".", "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') + CheckDefExecAndScriptFailure(['line("")'], 'E1209: Invalid value for a line number') enddef def Test_line2byte() CheckDefAndScriptFailure2(['line2byte(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['line2byte("")'], 'E1209: Invalid value for a line number') assert_equal(-1, line2byte(1)) assert_equal(-1, line2byte(10000)) enddef def Test_lispindent() CheckDefAndScriptFailure2(['lispindent({})'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['lispindent("")'], 'E1209: Invalid value for a line number') assert_equal(0, lispindent(1)) enddef *************** *** 2048,2053 **** --- 2098,2105 ---- CheckDefAndScriptFailure2(['matchadd("a", "b", "c")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3') CheckDefAndScriptFailure2(['matchadd("a", "b", 1, "d")'], 'E1013: Argument 4: type mismatch, expected number but got string', 'E1210: Number required for argument 4') CheckDefAndScriptFailure2(['matchadd("a", "b", 1, 1, [])'], 'E1013: Argument 5: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 5') + matchadd('', 'a')->assert_equal(-1) + matchadd('Search', '')->assert_equal(-1) enddef def Test_matchaddpos() *************** *** 2056,2061 **** --- 2108,2114 ---- CheckDefAndScriptFailure2(['matchaddpos("a", [1], "c")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3') CheckDefAndScriptFailure2(['matchaddpos("a", [1], 1, "d")'], 'E1013: Argument 4: type mismatch, expected number but got string', 'E1210: Number required for argument 4') CheckDefAndScriptFailure2(['matchaddpos("a", [1], 1, 1, [])'], 'E1013: Argument 5: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 5') + matchaddpos('', [1])->assert_equal(-1) enddef def Test_matcharg() *************** *** 2203,2208 **** --- 2256,2262 ---- def Test_nextnonblank() CheckDefAndScriptFailure2(['nextnonblank(null)'], 'E1013: Argument 1: type mismatch, expected string but got special', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['nextnonblank("")'], 'E1209: Invalid value for a line number') assert_equal(0, nextnonblank(1)) enddef *************** *** 2329,2334 **** --- 2383,2389 ---- def Test_prevnonblank() CheckDefAndScriptFailure2(['prevnonblank(null)'], 'E1013: Argument 1: type mismatch, expected string but got special', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['prevnonblank("")'], 'E1209: Invalid value for a line number') assert_equal(0, prevnonblank(1)) enddef *************** *** 2472,2482 **** --- 2527,2545 ---- eval expand('sautest')->readdirex((e) => e.name[0] !=# '.') CheckDefAndScriptFailure2(['readdir(["a"])'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['readdir("a", "1", [3])'], 'E1013: Argument 3: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 3') + if has('unix') + # only fails on Unix-like systems + assert_fails('readdir("")', 'E484: Can''t open file') + endif enddef def Test_readdirex() CheckDefAndScriptFailure2(['readdirex(["a"])'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['readdirex("a", "1", [3])'], 'E1013: Argument 3: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 3') + if has('unix') + # only fails on Unix-like systems + assert_fails('readdirex("")', 'E484: Can''t open file') + endif enddef def Test_readblob() *************** *** 2489,2494 **** --- 2552,2558 ---- var read: list = readblob('Xreadblob') END CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected list but got blob', 1) + CheckDefExecAndScriptFailure(['readblob("")'], 'E484: Can''t open file ') delete('Xreadblob') enddef *************** *** 2574,2579 **** --- 2638,2644 ---- CheckEnv DISPLAY CheckDefAndScriptFailure2(['remote_peek(0z10)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['remote_peek("a5b6c7", [1])'], 'E1013: Argument 2: type mismatch, expected string but got list', 'E1174: String required for argument 2') + CheckDefExecAndScriptFailure(['remote_peek("")'], 'E573: Invalid server id used') enddef def Test_remote_read() *************** *** 2581,2586 **** --- 2646,2652 ---- CheckEnv DISPLAY CheckDefAndScriptFailure2(['remote_read(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['remote_read("a", "x")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') + CheckDefExecAndScriptFailure(['remote_read("")'], 'E573: Invalid server id used') enddef def Test_remote_send() *************** *** 2827,2832 **** --- 2893,2899 ---- CheckEnv DISPLAY CheckDefAndScriptFailure2(['server2client(10, "b")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['server2client("a", 10)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') + CheckDefExecAndScriptFailure(['server2client("", "a")'], 'E573: Invalid server id used') enddef def Test_shellescape() *************** *** 2910,2915 **** --- 2977,2983 ---- CheckDefAndScriptFailure2(['setbufvar(true, "v", 3)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['setbufvar(1, 2, 3)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') + assert_fails('setbufvar("%", "", 10)', 'E461: Illegal variable name') enddef def Test_setbufline() *************** *** 2937,2942 **** --- 3005,3011 ---- CheckDefAndScriptFailure2(['setcharpos(1, [])'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefFailure(['setcharpos(".", ["a"])'], 'E1013: Argument 2: type mismatch, expected list but got list') CheckDefAndScriptFailure2(['setcharpos(".", 1)'], 'E1013: Argument 2: type mismatch, expected list but got number', 'E1211: List required for argument 2') + CheckDefExecAndScriptFailure(['setcharpos("", [0, 1, 1, 1])'], 'E474: Invalid argument') enddef def Test_setcharsearch() *************** *** 2955,2960 **** --- 3024,3030 ---- CheckDefAndScriptFailure2(['setcursorcharpos(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected number but got blob', 'E1224: String, Number or List required for argument 1') CheckDefAndScriptFailure2(['setcursorcharpos(1, "2")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') CheckDefAndScriptFailure2(['setcursorcharpos(1, 2, "3")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3') + CheckDefExecAndScriptFailure(['setcursorcharpos("", 10)'], 'E1209: Invalid value for a line number') enddef def Test_setenv() *************** *** 2964,2969 **** --- 3034,3040 ---- def Test_setfperm() CheckDefAndScriptFailure2(['setfperm(1, "b")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['setfperm("a", 0z10)'], 'E1013: Argument 2: type mismatch, expected string but got blob', 'E1174: String required for argument 2') + CheckDefExecAndScriptFailure(['setfperm("Xfile", "")'], 'E475: Invalid argument') enddef def Test_setline() *************** *** 2977,2982 **** --- 3048,3054 ---- setline(1, 10) assert_equal(['10', 'b', 'c', 'd'], getline(1, '$')) CheckDefAndScriptFailure2(['setline([1], "x")'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1220: String or Number required for argument 1') + CheckDefExecAndScriptFailure(['setline("", "x")'], 'E1209: Invalid value for a line number') bw! enddef *************** *** 3000,3005 **** --- 3072,3078 ---- CheckDefAndScriptFailure2(['setpos(1, [])'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefFailure(['setpos(".", ["a"])'], 'E1013: Argument 2: type mismatch, expected list but got list') CheckDefAndScriptFailure2(['setpos(".", 1)'], 'E1013: Argument 2: type mismatch, expected list but got number', 'E1211: List required for argument 2') + CheckDefExecAndScriptFailure(['setpos("", [0, 1, 1, 1])'], 'E474: Invalid argument') enddef def Test_setqflist() *************** *** 3021,3032 **** --- 3094,3107 ---- def Test_settabvar() CheckDefAndScriptFailure2(['settabvar("a", "b", 1)'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1') CheckDefAndScriptFailure2(['settabvar(1, 2, "c")'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') + assert_fails('settabvar(1, "", 10)', 'E461: Illegal variable name') enddef def Test_settabwinvar() CheckDefAndScriptFailure2(['settabwinvar("a", 2, "c", true)'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1') CheckDefAndScriptFailure2(['settabwinvar(1, "b", "c", [])'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') CheckDefAndScriptFailure2(['settabwinvar(1, 1, 3, {})'], 'E1013: Argument 3: type mismatch, expected string but got number', 'E1174: String required for argument 3') + assert_fails('settabwinvar(1, 1, "", 10)', 'E461: Illegal variable name') enddef def Test_settagstack() *************** *** 3038,3043 **** --- 3113,3119 ---- def Test_setwinvar() CheckDefAndScriptFailure2(['setwinvar("a", "b", 1)'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1') CheckDefAndScriptFailure2(['setwinvar(1, 2, "c")'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') + assert_fails('setwinvar(1, "", 10)', 'E461: Illegal variable name') enddef def Test_sha256() *************** *** 3142,3147 **** --- 3218,3224 ---- CheckDefAndScriptFailure2(['spellsuggest(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['spellsuggest("a", "b")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') CheckDefAndScriptFailure2(['spellsuggest("a", 1, 0z01)'], 'E1013: Argument 3: type mismatch, expected bool but got blob', 'E1212: Bool required for argument 3') + spellsuggest('')->assert_equal([]) enddef def Test_sound_playevent() *************** *** 3342,3348 **** def Test_swapinfo() CheckDefAndScriptFailure2(['swapinfo({})'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1174: String required for argument 1') ! call assert_equal({error: 'Cannot open file'}, swapinfo('x')) enddef def Test_swapname() --- 3419,3426 ---- def Test_swapinfo() CheckDefAndScriptFailure2(['swapinfo({})'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1174: String required for argument 1') ! call swapinfo('x')->assert_equal({error: 'Cannot open file'}) ! call swapinfo('')->assert_equal({error: 'Cannot open file'}) enddef def Test_swapname() *************** *** 3358,3363 **** --- 3436,3442 ---- CheckDefAndScriptFailure2(['synID(0z10, 1, true)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['synID("a", true, false)'], 'E1013: Argument 2: type mismatch, expected number but got bool', 'E1210: Number required for argument 2') CheckDefAndScriptFailure2(['synID(1, 1, 2)'], 'E1013: Argument 3: type mismatch, expected bool but got number', 'E1212: Bool required for argument 3') + CheckDefExecAndScriptFailure(['synID("", 10, true)'], 'E1209: Invalid value for a line number') enddef def Test_synIDattr() *************** *** 3373,3383 **** --- 3452,3466 ---- def Test_synconcealed() CheckDefAndScriptFailure2(['synconcealed(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['synconcealed(1, "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') + if has('conceal') + CheckDefExecAndScriptFailure(['synconcealed("", 4)'], 'E1209: Invalid value for a line number') + endif enddef def Test_synstack() CheckDefAndScriptFailure2(['synstack(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1220: String or Number required for argument 1') CheckDefAndScriptFailure2(['synstack(1, "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') + CheckDefExecAndScriptFailure(['synstack("", 4)'], 'E1209: Invalid value for a line number') enddef def Test_system() *************** *** 3404,3409 **** --- 3487,3493 ---- def Test_tabpagenr() CheckDefAndScriptFailure2(['tabpagenr(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') + CheckDefExecAndScriptFailure(['tabpagenr("")'], 'E15: Invalid expression') assert_equal(1, tabpagenr('$')) assert_equal(1, tabpagenr()) enddef *************** *** 3411,3416 **** --- 3495,3501 ---- def Test_tabpagewinnr() CheckDefAndScriptFailure2(['tabpagewinnr("x")'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1') CheckDefAndScriptFailure2(['tabpagewinnr(1, 2)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') + CheckDefExecAndScriptFailure(['tabpagewinnr(1, "")'], 'E15: Invalid expression') enddef def Test_taglist() *************** *** 3423,3428 **** --- 3508,3514 ---- CheckDefAndScriptFailure2(['term_dumpload({"a": 10})'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['term_dumpload({"a": 10}, "b")'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['term_dumpload("a", ["b"])'], 'E1013: Argument 2: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 2') + CheckDefExecAndScriptFailure(['term_dumpload("")'], 'E485: Can''t read file') enddef def Test_term_dumpdiff() *************** *** 3430,3435 **** --- 3516,3522 ---- CheckDefAndScriptFailure2(['term_dumpdiff(1, "b")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['term_dumpdiff("a", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') CheckDefAndScriptFailure2(['term_dumpdiff("a", "b", [1])'], 'E1013: Argument 3: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 3') + CheckDefExecAndScriptFailure(['term_dumpdiff("", "")'], 'E485: Can''t read file') enddef def Test_term_dumpwrite() *************** *** 3565,3570 **** --- 3652,3658 ---- CheckDefAndScriptFailure2(['term_start({})'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1222: String or List required for argument 1') CheckDefAndScriptFailure2(['term_start([], [])'], 'E1013: Argument 2: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 2') CheckDefAndScriptFailure2(['term_start("", "")'], 'E1013: Argument 2: type mismatch, expected dict but got string', 'E1206: Dictionary required for argument 2') + CheckDefExecAndScriptFailure(['term_start("")'], 'E474: Invalid argument') enddef def Test_term_wait() *************** *** 3722,3727 **** --- 3810,3816 ---- def Test_virtcol() CheckDefAndScriptFailure2(['virtcol(1.1)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E1222: String or List required for argument 1') + CheckDefExecAndScriptFailure(['virtcol("")'], 'E1209: Invalid value for a line number') new setline(1, ['abcdefgh']) cursor(1, 4) *************** *** 3802,3807 **** --- 3891,3897 ---- def Test_winnr() CheckDefAndScriptFailure2(['winnr([])'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1174: String required for argument 1') + CheckDefExecAndScriptFailure(['winnr("")'], 'E15: Invalid expression') assert_equal(1, winnr()) assert_equal(1, winnr('$')) enddef *************** *** 3841,3844 **** --- 3931,3938 ---- CheckDefAndScriptFailure2(['xor(0x1, "x")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') enddef + def Test_writefile() + CheckDefExecAndScriptFailure(['writefile(["a"], "")'], 'E482: Can''t create file ') + enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker *** ../vim-8.2.3414/src/version.c 2021-09-08 14:29:43.117509762 +0200 --- src/version.c 2021-09-08 14:56:30.593348881 +0200 *************** *** 757,758 **** --- 757,760 ---- { /* Add new patch number below this line */ + /**/ + 3415, /**/ -- hundred-and-one symptoms of being an internet addict: 7. You finally do take that vacation, but only after buying a USB modem and a laptop. /// 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 ///