]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cppinit.c (cpp_start_read): Free the imacros list as we traverse it.
authorNeil Booth <neil@daikokuya.demon.co.uk>
Sat, 1 Sep 2001 10:22:17 +0000 (10:22 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Sat, 1 Sep 2001 10:22:17 +0000 (10:22 +0000)
* 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
gcc/cppinit.c

index b68e849dfbe921a97656715bdccd816408ab6883..824a3303c6abcc8942de1e580b474527e174d73f 100644 (file)
@@ -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.
index 9e5fa8e5fd9def5f2ee8c0967750e245d92d1806..8b8f56979abf917837262f4a129f8c1687e222da 100644 (file)
@@ -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)
        {