From 7bb4c6e3f6d65bb6c0654d72dfe8cb5fa7f0fde2 Mon Sep 17 00:00:00 2001
From: Bram Moolenaar <Bram@vim.org>
Date: Wed, 7 Sep 2005 21:22:27 +0000
Subject: [PATCH] updated for version 7.0143

---
 src/eval.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/eval.c b/src/eval.c
index 448bd7f306..3737126de3 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2831,6 +2831,8 @@ eval_for_line(arg, errp, nextcmdp, skip)
 	    }
 	    else
 	    {
+		/* No need to increment the refcount, it's already set for the
+		 * list being used in "tv". */
 		fi->fi_list = l;
 		list_add_watch(l, &fi->fi_lw);
 		fi->fi_lw.lw_item = l->lv_first;
@@ -5861,14 +5863,16 @@ garbage_collect()
 
     /*
      * 3. Go through the list of lists and free items without the copyID.
+     *    But don't free a list that has a watcher (used in a for loop), these
+     *    are not referenced anywhere.
      */
     for (ll = first_list; ll != NULL; )
-	if (ll->lv_copyID != copyID)
+	if (ll->lv_copyID != copyID && ll->lv_watch == NULL)
 	{
 	    list_free(ll);
 	    did_free = TRUE;
 
-	    /* restart, next dict may also have been freed */
+	    /* restart, next list may also have been freed */
 	    ll = first_list;
 	}
 	else
-- 
GitLab