patch 9.0.2172: Vim9: compiling :defer may fail

Problem:  Vim9: compiling :defer may fail
Solution: compile defer, when ctx_skip is not SKIP_YES

compiling defer fails in an if statement with false condition,
so check the ctx_skip value when compiling :defer

fixes:  #13698
closes: #13702

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/vim9cmds.c b/src/vim9cmds.c
index 392bab4..07e6501 100644
--- a/src/vim9cmds.c
+++ b/src/vim9cmds.c
@@ -2020,11 +2020,14 @@
     *paren = '(';
 
     // check for function type
-    type = get_type_on_stack(cctx, 0);
-    if (type->tt_type != VAR_FUNC)
+    if (cctx->ctx_skip != SKIP_YES)
     {
-	emsg(_(e_function_name_required));
-	return NULL;
+	type = get_type_on_stack(cctx, 0);
+	if (type->tt_type != VAR_FUNC)
+	{
+	    emsg(_(e_function_name_required));
+	    return NULL;
+	}
     }
 
     // compile the arguments
@@ -2032,24 +2035,27 @@
     if (compile_arguments(&arg, cctx, &argcount, CA_NOT_SPECIAL) == FAIL)
 	return NULL;
 
-    if (func_idx >= 0)
+    if (cctx->ctx_skip != SKIP_YES)
     {
-	type2_T	*argtypes = NULL;
-	type2_T	shuffled_argtypes[MAX_FUNC_ARGS];
+	if (func_idx >= 0)
+	{
+	    type2_T	*argtypes = NULL;
+	    type2_T	shuffled_argtypes[MAX_FUNC_ARGS];
 
-	if (check_internal_func_args(cctx, func_idx, argcount, FALSE,
-					 &argtypes, shuffled_argtypes) == FAIL)
+	    if (check_internal_func_args(cctx, func_idx, argcount, FALSE,
+			&argtypes, shuffled_argtypes) == FAIL)
+		return NULL;
+	}
+	else if (check_func_args_from_type(cctx, type, argcount, TRUE,
+		    arg_start) == FAIL)
+	    return NULL;
+
+	defer_var_idx = get_defer_var_idx(cctx);
+	if (defer_var_idx == 0)
+	    return NULL;
+	if (generate_DEFER(cctx, defer_var_idx - 1, argcount) == FAIL)
 	    return NULL;
     }
-    else if (check_func_args_from_type(cctx, type, argcount, TRUE,
-							    arg_start) == FAIL)
-	return NULL;
-
-    defer_var_idx = get_defer_var_idx(cctx);
-    if (defer_var_idx == 0)
-	return NULL;
-    if (generate_DEFER(cctx, defer_var_idx - 1, argcount) == FAIL)
-	return NULL;
 
     return skipwhite(arg);
 }