To: vim_dev@googlegroups.com Subject: Patch 8.2.4554 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4554 Problem: Vim9: using null values not sufficiently tested. Solution: Add more tests. Fix uncovered problem. Files: src/vim9type.c, src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_func.vim *** ../vim-8.2.4553/src/vim9type.c 2022-03-08 19:43:51.688198945 +0000 --- src/vim9type.c 2022-03-12 21:22:22.004445141 +0000 *************** *** 1235,1240 **** --- 1235,1253 ---- { type_T *common; + // When one of the types is t_func_unknown return the other one. + // Useful if a list or dict item is null_func. + if (type1 == &t_func_unknown) + { + *dest = type2; + return; + } + if (type2 == &t_func_unknown) + { + *dest = type1; + return; + } + common_type(type1->tt_member, type2->tt_member, &common, type_gap); if (type1->tt_argcount == type2->tt_argcount && type1->tt_argcount >= 0) *** ../vim-8.2.4553/src/testdir/test_vim9_assign.vim 2022-03-09 19:46:43.161299056 +0000 --- src/testdir/test_vim9_assign.vim 2022-03-12 21:26:40.632322476 +0000 *************** *** 342,347 **** --- 342,363 ---- endif var d: dict = {a: function('tr'), b: null_function} + + var bl: list = [0z12, null_blob] + var dnl: list> = [{a: 1}, null_dict] + var dsl: list> = [{a: 'x'}, null_dict] + var lnl: list> = [[1], null_list] + var lsl: list> = [['x'], null_list] + def Len(v: string): number + return len(v) + enddef + var Ffl: list = [Len, null_function] + var Fpl: list = [Len, null_partial] + var sl: list = ['x', null_string] + if has('job') + var jl: list = [null_job] + var cl: list = [null_channel] + endif END v9.CheckDefAndScriptSuccess(lines) enddef *** ../vim-8.2.4553/src/testdir/test_vim9_func.vim 2022-03-11 18:54:13.980670599 +0000 --- src/testdir/test_vim9_func.vim 2022-03-12 20:48:41.598096539 +0000 *************** *** 3759,3764 **** --- 3759,3872 ---- v9.CheckScriptFailure(lines + ['echo H(G(F2))'], 'E1013:') enddef + def Test_call_func_with_null() + var lines =<< trim END + def Fstring(v: string) + assert_equal(null_string, v) + enddef + Fstring(null_string) + def Fblob(v: blob) + assert_equal(null_blob, v) + enddef + Fblob(null_blob) + def Flist(v: list) + assert_equal(null_list, v) + enddef + Flist(null_list) + def Fdict(v: dict) + assert_equal(null_dict, v) + enddef + Fdict(null_dict) + def Ffunc(Fv: func(number): number) + assert_equal(null_function, Fv) + enddef + Ffunc(null_function) + if has('channel') + def Fchannel(v: channel) + assert_equal(null_channel, v) + enddef + Fchannel(null_channel) + def Fjob(v: job) + assert_equal(null_job, v) + enddef + Fjob(null_job) + endif + END + v9.CheckDefAndScriptSuccess(lines) + enddef + + def Test_null_default_argument() + var lines =<< trim END + def Fstring(v: string = null_string) + assert_equal(null_string, v) + enddef + Fstring() + def Fblob(v: blob = null_blob) + assert_equal(null_blob, v) + enddef + Fblob() + def Flist(v: list = null_list) + assert_equal(null_list, v) + enddef + Flist() + def Fdict(v: dict = null_dict) + assert_equal(null_dict, v) + enddef + Fdict() + def Ffunc(Fv: func(number): number = null_function) + assert_equal(null_function, Fv) + enddef + Ffunc() + if has('channel') + def Fchannel(v: channel = null_channel) + assert_equal(null_channel, v) + enddef + Fchannel() + def Fjob(v: job = null_job) + assert_equal(null_job, v) + enddef + Fjob() + endif + END + v9.CheckDefAndScriptSuccess(lines) + enddef + + def Test_null_return() + var lines =<< trim END + def Fstring(): string + return null_string + enddef + assert_equal(null_string, Fstring()) + def Fblob(): blob + return null_blob + enddef + assert_equal(null_blob, Fblob()) + def Flist(): list + return null_list + enddef + assert_equal(null_list, Flist()) + def Fdict(): dict + return null_dict + enddef + assert_equal(null_dict, Fdict()) + def Ffunc(): func(number): number + return null_function + enddef + assert_equal(null_function, Ffunc()) + if has('channel') + def Fchannel(): channel + return null_channel + enddef + assert_equal(null_channel, Fchannel()) + def Fjob(): job + return null_job + enddef + assert_equal(null_job, Fjob()) + endif + END + v9.CheckDefAndScriptSuccess(lines) + enddef + def Test_list_any_type_checked() var lines =<< trim END vim9script *** ../vim-8.2.4553/src/version.c 2022-03-12 17:38:26.354365193 +0000 --- src/version.c 2022-03-12 20:37:19.818571324 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4554, /**/ -- "Marriage is when a man and woman become as one; the trouble starts when they try to decide which one" /// 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 ///