patch 8.2.0683: Vim9: parsing type does not always work

Problem:    Vim9: parsing type does not always work.
Solution:   Handle func type without return value.  Test more closures.
            Fix type check offset.  Fix garbage collection.
diff --git a/src/vim9execute.c b/src/vim9execute.c
index c27bcf0..2404282 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -2437,11 +2437,12 @@
 		break;
 	    case ISN_FUNCREF:
 		{
+		    funcref_T	*funcref = &iptr->isn_arg.funcref;
 		    dfunc_T	*df = ((dfunc_T *)def_functions.ga_data)
-					       + iptr->isn_arg.funcref.fr_func;
+							    + funcref->fr_func;
 
 		    smsg("%4d FUNCREF %s $%d", current, df->df_ufunc->uf_name,
-			   iptr->isn_arg.funcref.fr_var_idx + df->df_varcount);
+				     funcref->fr_var_idx + dfunc->df_varcount);
 		}
 		break;
 
@@ -2675,5 +2676,25 @@
     return OK;
 }
 
+/*
+ * Mark items in a def function as used.
+ */
+    int
+set_ref_in_dfunc(ufunc_T *ufunc, int copyID)
+{
+    dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) + ufunc->uf_dfunc_idx;
+    int	    abort = FALSE;
+
+    if (dfunc->df_funcstack != NULL)
+    {
+	typval_T    *stack = dfunc->df_funcstack->fs_ga.ga_data;
+	int	    idx;
+
+	for (idx = 0; idx < dfunc->df_funcstack->fs_ga.ga_len; ++idx)
+	    abort = abort || set_ref_in_item(stack + idx, copyID, NULL, NULL);
+    }
+    return abort;
+}
+
 
 #endif // FEAT_EVAL