To: vim_dev@googlegroups.com Subject: Patch 9.0.0703 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0703 Problem: Failing check for argument type for const any. Solution: Check for any type properly. (closes #11316) Files: src/evalfunc.c, src/vim9type.c, src/proto/vim9type.pro, src/testdir/test_vim9_script.vim *** ../vim-9.0.0702/src/evalfunc.c 2022-10-07 14:31:04.320852668 +0100 --- src/evalfunc.c 2022-10-09 12:51:21.574160614 +0100 *************** *** 257,266 **** static int arg_float_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_FLOAT ! || type->tt_type == VAR_NUMBER) return OK; arg_type_mismatch(&t_number, type, context->arg_idx + 1); return FAIL; --- 257,265 ---- static int arg_float_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_FLOAT ! || type->tt_type == VAR_NUMBER ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_number, type, context->arg_idx + 1); return FAIL; *************** *** 356,365 **** static int arg_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_LIST ! || type->tt_type == VAR_BLOB) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; --- 355,363 ---- static int arg_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_LIST ! || type->tt_type == VAR_BLOB ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; *************** *** 385,394 **** static int arg_string_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING ! || type->tt_type == VAR_NUMBER) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 383,391 ---- static int arg_string_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING ! || type->tt_type == VAR_NUMBER ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 400,409 **** static int arg_buffer(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING ! || type->tt_type == VAR_NUMBER) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 397,405 ---- static int arg_buffer(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING ! || type->tt_type == VAR_NUMBER ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 415,425 **** static int arg_buffer_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING || type->tt_type == VAR_NUMBER ! || type->tt_type == VAR_DICT) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 411,420 ---- static int arg_buffer_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING || type->tt_type == VAR_NUMBER ! || type->tt_type == VAR_DICT ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 431,440 **** static int arg_lnum(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING ! || type->tt_type == VAR_NUMBER) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 426,434 ---- static int arg_lnum(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING ! || type->tt_type == VAR_NUMBER ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 446,454 **** static int arg_string_or_list_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING) return OK; if (type->tt_type != VAR_LIST) { --- 440,447 ---- static int arg_string_or_list_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING ! || type_any_or_unknown(type)) return OK; if (type->tt_type != VAR_LIST) { *************** *** 469,478 **** static int arg_string_or_list_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING ! || type->tt_type == VAR_LIST) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 462,470 ---- static int arg_string_or_list_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING ! || type->tt_type == VAR_LIST ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 484,493 **** static int arg_string_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING ! || type->tt_type == VAR_DICT) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 476,484 ---- static int arg_string_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING ! || type->tt_type == VAR_DICT ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 499,508 **** static int arg_string_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING ! || type->tt_type == VAR_BLOB) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 490,498 ---- static int arg_string_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING ! || type->tt_type == VAR_BLOB ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 514,523 **** static int arg_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_LIST ! || type->tt_type == VAR_DICT) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; --- 504,512 ---- static int arg_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_LIST ! || type->tt_type == VAR_DICT ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; *************** *** 547,557 **** type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_LIST || type->tt_type == VAR_DICT ! || type->tt_type == VAR_BLOB) return arg_type_modifiable(type, context->arg_idx + 1); arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; --- 536,545 ---- type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_LIST || type->tt_type == VAR_DICT ! || type->tt_type == VAR_BLOB ! || type_any_or_unknown(type)) return arg_type_modifiable(type, context->arg_idx + 1); arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; *************** *** 563,574 **** static int arg_list_or_dict_or_blob_or_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_LIST || type->tt_type == VAR_DICT || type->tt_type == VAR_BLOB ! || type->tt_type == VAR_STRING) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; --- 551,561 ---- static int arg_list_or_dict_or_blob_or_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_LIST || type->tt_type == VAR_DICT || type->tt_type == VAR_BLOB ! || type->tt_type == VAR_STRING ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; *************** *** 642,656 **** } } ! if ((type->tt_member != &t_any && type->tt_member != &t_unknown) ! || args[0] != NULL) { where_T where = WHERE_INIT; if (is_map) t_func_exp.tt_member = expected_member == NULL ! || type->tt_member == &t_any ! || type->tt_member == &t_unknown ? &t_any : expected_member; else t_func_exp.tt_member = &t_bool; --- 629,641 ---- } } ! if (!type_any_or_unknown(type->tt_member) || args[0] != NULL) { where_T where = WHERE_INIT; if (is_map) t_func_exp.tt_member = expected_member == NULL ! || type_any_or_unknown(type->tt_member) ? &t_any : expected_member; else t_func_exp.tt_member = &t_bool; *************** *** 673,680 **** { if (type->tt_type == VAR_STRING || type->tt_type == VAR_PARTIAL ! || type == &t_unknown ! || type == &t_any) return OK; if (type->tt_type == VAR_FUNC) --- 658,664 ---- { if (type->tt_type == VAR_STRING || type->tt_type == VAR_PARTIAL ! || type_any_or_unknown(type)) return OK; if (type->tt_type == VAR_FUNC) *************** *** 691,698 **** { if (type->tt_type == VAR_STRING || type->tt_type == VAR_PARTIAL ! || type == &t_unknown ! || type == &t_any) return OK; if (type->tt_type == VAR_FUNC) --- 675,681 ---- { if (type->tt_type == VAR_STRING || type->tt_type == VAR_PARTIAL ! || type_any_or_unknown(type)) return OK; if (type->tt_type == VAR_FUNC) *************** *** 709,716 **** { if (type->tt_type == VAR_STRING || type->tt_type == VAR_PARTIAL ! || type == &t_unknown ! || type == &t_any) return OK; if (type->tt_type == VAR_FUNC) --- 692,698 ---- { if (type->tt_type == VAR_STRING || type->tt_type == VAR_PARTIAL ! || type_any_or_unknown(type)) return OK; if (type->tt_type == VAR_FUNC) *************** *** 722,729 **** args[0] = context->arg_types[0].type_curr->tt_member; else args[0] = &t_unknown; ! if ((type->tt_member != &t_any && type->tt_member != &t_unknown) ! || args[0] != &t_unknown) { where_T where = WHERE_INIT; --- 704,710 ---- args[0] = context->arg_types[0].type_curr->tt_member; else args[0] = &t_unknown; ! if (!type_any_or_unknown(type->tt_member) || args[0] != &t_unknown) { where_T where = WHERE_INIT; *************** *** 748,760 **** static int arg_string_or_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING || type->tt_type == VAR_PARTIAL || type->tt_type == VAR_FUNC || type->tt_type == VAR_BOOL ! || type->tt_type == VAR_NUMBER) return OK; arg_type_mismatch(&t_func_any, type, context->arg_idx + 1); return FAIL; --- 729,740 ---- static int arg_string_or_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING || type->tt_type == VAR_PARTIAL || type->tt_type == VAR_FUNC || type->tt_type == VAR_BOOL ! || type->tt_type == VAR_NUMBER ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_func_any, type, context->arg_idx + 1); return FAIL; *************** *** 766,776 **** static int arg_string_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_LIST || type->tt_type == VAR_BLOB ! || type->tt_type == VAR_STRING) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; --- 746,755 ---- static int arg_string_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_LIST || type->tt_type == VAR_BLOB ! || type->tt_type == VAR_STRING ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); return FAIL; *************** *** 791,800 **** static int arg_chan_or_job(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_CHANNEL ! || type->tt_type == VAR_JOB) return OK; arg_type_mismatch(&t_channel, type, context->arg_idx + 1); return FAIL; --- 770,778 ---- static int arg_chan_or_job(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_CHANNEL ! || type->tt_type == VAR_JOB ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_channel, type, context->arg_idx + 1); return FAIL; *************** *** 854,864 **** static int arg_str_or_nr_or_list(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING || type->tt_type == VAR_NUMBER ! || type->tt_type == VAR_LIST) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 832,841 ---- static int arg_str_or_nr_or_list(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING || type->tt_type == VAR_NUMBER ! || type->tt_type == VAR_LIST ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 870,879 **** static int arg_dict_any_or_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_DICT ! || type->tt_type == VAR_STRING) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; --- 847,855 ---- static int arg_dict_any_or_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_DICT ! || type->tt_type == VAR_STRING ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); return FAIL; *************** *** 902,914 **** static int arg_get1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_BLOB || type->tt_type == VAR_LIST || type->tt_type == VAR_DICT || type->tt_type == VAR_FUNC ! || type->tt_type == VAR_PARTIAL) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); --- 878,889 ---- static int arg_get1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_BLOB || type->tt_type == VAR_LIST || type->tt_type == VAR_DICT || type->tt_type == VAR_FUNC ! || type->tt_type == VAR_PARTIAL ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); *************** *** 922,934 **** static int arg_len1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING || type->tt_type == VAR_NUMBER || type->tt_type == VAR_BLOB || type->tt_type == VAR_LIST ! || type->tt_type == VAR_DICT) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); --- 897,908 ---- static int arg_len1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING || type->tt_type == VAR_NUMBER || type->tt_type == VAR_BLOB || type->tt_type == VAR_LIST ! || type->tt_type == VAR_DICT ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); *************** *** 958,969 **** static int arg_repeat1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING || type->tt_type == VAR_NUMBER || type->tt_type == VAR_BLOB ! || type->tt_type == VAR_LIST) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); --- 932,942 ---- static int arg_repeat1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING || type->tt_type == VAR_NUMBER || type->tt_type == VAR_BLOB ! || type->tt_type == VAR_LIST ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_string, type, context->arg_idx + 1); *************** *** 977,987 **** static int arg_slice1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_LIST || type->tt_type == VAR_BLOB ! || type->tt_type == VAR_STRING) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); --- 950,959 ---- static int arg_slice1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_LIST || type->tt_type == VAR_BLOB ! || type->tt_type == VAR_STRING ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_list_any, type, context->arg_idx + 1); *************** *** 995,1005 **** static int arg_string_or_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_STRING || type->tt_type == VAR_LIST ! || type->tt_type == VAR_DICT) return OK; semsg(_(e_string_list_or_dict_required_for_argument_nr), --- 967,976 ---- static int arg_string_or_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_STRING || type->tt_type == VAR_LIST ! || type->tt_type == VAR_DICT ! || type_any_or_unknown(type)) return OK; semsg(_(e_string_list_or_dict_required_for_argument_nr), *************** *** 1014,1024 **** static int arg_cursor1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_NUMBER || type->tt_type == VAR_STRING ! || type->tt_type == VAR_LIST) return OK; arg_type_mismatch(&t_number, type, context->arg_idx + 1); --- 985,994 ---- static int arg_cursor1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context) { ! if (type->tt_type == VAR_NUMBER || type->tt_type == VAR_STRING ! || type->tt_type == VAR_LIST ! || type_any_or_unknown(type)) return OK; arg_type_mismatch(&t_number, type, context->arg_idx + 1); *** ../vim-9.0.0702/src/vim9type.c 2022-09-30 12:00:02.329104816 +0100 --- src/vim9type.c 2022-10-09 12:41:42.297715665 +0100 *************** *** 337,342 **** --- 337,353 ---- } /* + * Return TRUE if "type" is NULL, any or unknown. + * This also works for const (comparing with &t_any and &t_unknown doesn't). + */ + int + type_any_or_unknown(type_T *type) + { + return type == NULL || type->tt_type == VAR_ANY + || type->tt_type == VAR_UNKNOWN; + } + + /* * Get a type_T for a typval_T. * "type_gap" is used to temporarily create types in. * When "flags" has TVTT_DO_MEMBER also get the member type, otherwise use *** ../vim-9.0.0702/src/proto/vim9type.pro 2022-09-29 19:14:37.675876694 +0100 --- src/proto/vim9type.pro 2022-10-09 12:42:08.645754593 +0100 *************** *** 9,14 **** --- 9,15 ---- type_T *alloc_func_type(type_T *ret_type, int argcount, garray_T *type_gap); type_T *get_func_type(type_T *ret_type, int argcount, garray_T *type_gap); int func_type_add_arg_types(type_T *functype, int argcount, garray_T *type_gap); + int type_any_or_unknown(type_T *type); int need_convert_to_bool(type_T *type, typval_T *tv); type_T *typval2type(typval_T *tv, int copyID, garray_T *type_gap, int flags); type_T *typval2type_vimvar(typval_T *tv, garray_T *type_gap); *** ../vim-9.0.0702/src/testdir/test_vim9_script.vim 2022-10-08 14:39:31.966903597 +0100 --- src/testdir/test_vim9_script.vim 2022-10-09 12:38:01.657274740 +0100 *************** *** 305,310 **** --- 305,329 ---- assert_equal(v:t_number, type(foo.bar)) END v9.CheckDefAndScriptSuccess(lines) + + # also when used as a builtin function argument + lines =<< trim END + vim9script + + def SorterFunc(lhs: dict, rhs: dict): number + return lhs.name <# rhs.name ? -1 : 1 + enddef + + def Run(): void + var list = [{name: "3"}, {name: "2"}] + const Sorter = get({}, "unknown", SorterFunc) + sort(list, Sorter) + assert_equal([{name: "2"}, {name: "3"}], list) + enddef + + Run() + END + v9.CheckScriptSuccess(lines) enddef def Test_const_bang() *** ../vim-9.0.0702/src/version.c 2022-10-09 11:44:22.953119184 +0100 --- src/version.c 2022-10-09 12:35:44.388866945 +0100 *************** *** 701,702 **** --- 701,704 ---- { /* Add new patch number below this line */ + /**/ + 703, /**/ -- Veni, Vidi, Video -- I came, I saw, I taped what I saw. /// 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 ///