diff src/list.c @ 26931:6cdf92e77a91 v8.2.3994

patch 8.2.3994: Vim9: extend() complains about type when it was not declared Commit: https://github.com/vim/vim/commit/ad8f2485856eadb931ebd1f633ca366a40e415b8 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jan 3 16:52:28 2022 +0000 patch 8.2.3994: Vim9: extend() complains about type when it was not declared Problem: Vim9: extend() complains about the type even when it was not declared. Solution: Only check the list or dict type when it was declared.
author Bram Moolenaar <Bram@vim.org>
date Mon, 03 Jan 2022 18:00:03 +0100
parents 4e77f9961650
children ccb9be1cdd71
line wrap: on
line diff
--- a/src/list.c
+++ b/src/list.c
@@ -2758,25 +2758,26 @@ list_extend_func(
 extend(typval_T *argvars, typval_T *rettv, char_u *arg_errmsg, int is_new)
 {
     type_T	*type = NULL;
-    garray_T	type_list;
     char	*func_name = is_new ? "extendnew()" : "extend()";
 
-    if (!is_new && in_vim9script())
+    if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST)
     {
-	// Check that extend() does not change the type of the dict.
-	ga_init2(&type_list, sizeof(type_T *), 10);
-	type = typval2type(argvars, get_copyID(), &type_list, TVTT_DO_MEMBER);
+	// Check that extend() does not change the type of the list if it was
+	// declared.
+	if (!is_new && in_vim9script() && argvars[0].vval.v_list != NULL)
+	    type = argvars[0].vval.v_list->lv_type;
+	list_extend_func(argvars, type, func_name, arg_errmsg, is_new, rettv);
     }
-
-    if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST)
-	list_extend_func(argvars, type, func_name, arg_errmsg, is_new, rettv);
     else if (argvars[0].v_type == VAR_DICT && argvars[1].v_type == VAR_DICT)
+    {
+	// Check that extend() does not change the type of the list if it was
+	// declared.
+	if (!is_new && in_vim9script() && argvars[0].vval.v_dict != NULL)
+	    type = argvars[0].vval.v_dict->dv_type;
 	dict_extend_func(argvars, type, func_name, arg_errmsg, is_new, rettv);
+    }
     else
 	semsg(_(e_argument_of_str_must_be_list_or_dictionary), func_name);
-
-    if (type != NULL)
-	clear_type_list(&type_list);
 }
 
 /*