From 53aabfbce906da1e583b951fd0b1ef0521e86d8f Mon Sep 17 00:00:00 2001
From: Neil Booth <neil@daikokuya.demon.co.uk>
Date: Sat, 1 Sep 2001 10:22:17 +0000
Subject: [PATCH] cppinit.c (cpp_start_read): Free the imacros list as we
 traverse it.

	* cppinit.c (cpp_start_read): Free the imacros list as we
	traverse it.  Don't free the chains before returning.
	(_cpp_push_next_buffer): Only try pushing buffers if we've
	completed -imacros handling.

From-SVN: r45349
---
 gcc/ChangeLog |  7 +++++++
 gcc/cppinit.c | 12 +++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b68e849dfbe9..824a3303c6ab 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2001-09-01  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+	* cppinit.c (cpp_start_read): Free the imacros list as we
+	traverse it.  Don't free the chains before returning.
+	(_cpp_push_next_buffer): Only try pushing buffers if we've
+	completed -imacros handling.
+
 2001-08-31  Eric Christopher  <echristo@redhat.com>
 
 	* gcc.c (handle_braces): Add explaination for abort.
diff --git a/gcc/cppinit.c b/gcc/cppinit.c
index 9e5fa8e5fd9d..8b8f56979abf 100644
--- a/gcc/cppinit.c
+++ b/gcc/cppinit.c
@@ -958,18 +958,19 @@ cpp_start_read (pfile, fname)
 
       /* Scan -imacros files after command line defines, but before
 	 files given with -include.  */
-      for (p = CPP_OPTION (pfile, pending)->imacros_head; p; p = p->next)
+      while ((p = CPP_OPTION (pfile, pending)->imacros_head) != NULL)
 	{
 	  if (push_include (pfile, p))
 	    {
 	      pfile->buffer->return_at_eof = true;
 	      cpp_scan_nooutput (pfile);
 	    }
+	  CPP_OPTION (pfile, pending)->imacros_head = p->next;
+	  free (p);
 	}
     }
 
   free_chain (CPP_OPTION (pfile, pending)->directive_head);
-  free_chain (CPP_OPTION (pfile, pending)->imacros_head);
   _cpp_push_next_buffer (pfile);
 
   return 1;
@@ -984,7 +985,12 @@ _cpp_push_next_buffer (pfile)
 {
   bool pushed = false;
 
-  if (CPP_OPTION (pfile, pending))
+  /* This is't pretty; we'd rather not be relying on this as a boolean
+     for reverting the line map.  Further, we only free the chains in
+     this conditional, so an early call to cpp_finish / cpp_destroy
+     will leak that memory.  */
+  if (CPP_OPTION (pfile, pending)
+      && CPP_OPTION (pfile, pending)->imacros_head == NULL)
     {
       while (!pushed)
 	{
-- 
GitLab