Patch 8.2.3415

5 views
Skip to first unread message

Bram Moolenaar

unread,
Sep 8, 2021, 8:58:23 AM9/8/21
to vim...@googlegroups.com

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<number>', '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<number>', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['ch_open("a", [1])'], 'E1013: Argument 2: type mismatch, expected dict<any> but got list<number>', '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<number>', '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<unknown>', '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<number>', '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<unknown>', '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<string> 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<string> but got dict<unknown>', '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<number>', '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<unknown>', '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<any> but got list<unknown>', '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<any> but got list<unknown>', '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<string>', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['readdir("a", "1", [3])'], 'E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', '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<string>', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['readdirex("a", "1", [3])'], 'E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', '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<string> = readblob('Xreadblob')
END
CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected list<string> but got blob', 1)
+ CheckDefExecAndScriptFailure(['readblob("")'], 'E484: Can''t open file <empty>')
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<number>', '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<number> but got list<string>')
CheckDefAndScriptFailure2(['setcharpos(".", 1)'], 'E1013: Argument 2: type mismatch, expected list<number> 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<number>', '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<number> but got list<string>')
CheckDefAndScriptFailure2(['setpos(".", 1)'], 'E1013: Argument 2: type mismatch, expected list<number> 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<unknown>', '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<unknown>', '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<number>', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['term_dumpload({"a": 10}, "b")'], 'E1013: Argument 1: type mismatch, expected string but got dict<number>', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['term_dumpload("a", ["b"])'], 'E1013: Argument 2: type mismatch, expected dict<any> but got list<string>', '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<any> but got list<number>', '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<unknown>', 'E1222: String or List required for argument 1')
CheckDefAndScriptFailure2(['term_start([], [])'], 'E1013: Argument 2: type mismatch, expected dict<any> but got list<unknown>', 'E1206: Dictionary required for argument 2')
CheckDefAndScriptFailure2(['term_start("", "")'], 'E1013: Argument 2: type mismatch, expected dict<any> 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<unknown>', '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 <empty>')
+ 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 -- Br...@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 ///
Reply all
Reply to author
Forward
0 new messages