patch 9.0.0460: loop variable can't be found

Problem:    Loop variable can't be found.
Solution:   Adjust block_id of the loop variable each round.
diff --git a/src/ex_eval.c b/src/ex_eval.c
index 4315c2a..9afcb56 100644
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -1208,6 +1208,7 @@
     int		skip;
     int		result;
     cstack_T	*cstack = eap->cstack;
+    int		prev_cs_flags = 0;
 
     if (cstack->cs_idx == CSTACK_LEN - 1)
 	eap->errmsg = _(e_while_for_nesting_too_deep);
@@ -1261,6 +1262,7 @@
 		si->sn_current_block_id = si->sn_last_block_id;
 	    }
 	}
+	prev_cs_flags = cstack->cs_flags[cstack->cs_idx];
 	cstack->cs_flags[cstack->cs_idx] =
 			       eap->cmdidx == CMD_while ? CSF_WHILE : CSF_FOR;
 
@@ -1279,7 +1281,7 @@
 	}
 	else
 	{
-	    void	*fi;
+	    forinfo_T	*fi;
 	    evalarg_T	evalarg;
 
 	    /*
@@ -1313,9 +1315,18 @@
 		result = next_for_item(fi, eap->arg);
 	    else
 		result = FALSE;
+	    if (fi != NULL)
+		// OR all the cs_flags together, if a function was defined in
+		// any round then the loop variable may have been used.
+		fi->fi_cs_flags |= prev_cs_flags;
 
 	    if (!result)
 	    {
+		// If a function was defined in any round then set the
+		// CSF_FUNC_DEF flag now, so that it's seen by leave_block().
+		if (fi != NULL && (fi->fi_cs_flags & CSF_FUNC_DEF))
+		    cstack->cs_flags[cstack->cs_idx] |= CSF_FUNC_DEF;
+
 		free_for_info(fi);
 		cstack->cs_forinfo[cstack->cs_idx] = NULL;
 	    }