re PR pch/13675 (#including a precompiled header more than once in the same unit...
authorJakub Jelinek <jakub@redhat.com>
Tue, 1 Apr 2008 10:58:02 +0000 (12:58 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 1 Apr 2008 10:58:02 +0000 (12:58 +0200)
PR pch/13675
* files.c (struct _cpp_file): Remove pch field.
(pch_open_file): Don't set file->pch, just file->pchname.
(should_stack_file): After pfile->cb.read_pch call
free pchname and clear pchname, don't close file->fd.
Test file->pchname instead of file->pch.  Don't close fd after cb.
(_cpp_stack_include): Test file->pchname instead of file->pch.

* c-pch.c (c_common_read_pch): On error close (fd) resp. fclose (f).

From-SVN: r133790

gcc/ChangeLog
gcc/c-pch.c
libcpp/ChangeLog
libcpp/files.c

index f5ccc97d06300a1bbf834d17aeeea0b473a63602..0ba7058737f078802b74be5367987f572c353fe4 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR pch/13675
+       * c-pch.c (c_common_read_pch): On error close (fd) resp. fclose (f).
+
 2008-04-01  Rafael Espindola  <espindola@google.com>
 
        * tree-vrp.c (extract_code_and_val_from_cond_with_ops): New.
index 691e12a2f797e619cda522bf377f3a46effc330a..0da17f7f24ba80906db72c3841aad70116ded4ca 100644 (file)
@@ -373,6 +373,7 @@ c_common_read_pch (cpp_reader *pfile, const char *name,
   if (f == NULL)
     {
       cpp_errno (pfile, CPP_DL_ERROR, "calling fdopen");
+      close (fd);
       return;
     }
 
@@ -381,6 +382,7 @@ c_common_read_pch (cpp_reader *pfile, const char *name,
   if (fread (&h, sizeof (h), 1, f) != 1)
     {
       cpp_errno (pfile, CPP_DL_ERROR, "reading");
+      fclose (f);
       return;
     }
 
@@ -417,7 +419,10 @@ c_common_read_pch (cpp_reader *pfile, const char *name,
   gt_pch_restore (f);
 
   if (cpp_read_state (pfile, name, f, smd) != 0)
-    return;
+    {
+      fclose (f);
+      return;
+    }
 
   fclose (f);
 
index 0b3ce8b3a0c0a09f5480e009835764f583f61b50..e8719d931e1b8255ff2cac3963d1504b64628f94 100644 (file)
@@ -1,3 +1,13 @@
+2008-04-01  Jakub Jelinek  <jakub@redhat.com>
+
+       PR pch/13675
+       * files.c (struct _cpp_file): Remove pch field.
+       (pch_open_file): Don't set file->pch, just file->pchname.
+       (should_stack_file): After pfile->cb.read_pch call
+       free pchname and clear pchname, don't close file->fd.
+       Test file->pchname instead of file->pch.  Don't close fd after cb.
+       (_cpp_stack_include): Test file->pchname instead of file->pch.
+
 2008-03-28  Tom Tromey  <tromey@redhat.com>
 
        * Makefile.in (POSTCOMPILE): New variable.
index 467bb145ab9d517df5663697ca57d689a46b29ea..2bc3a801e3562e0d391ac7de6e69770073abd574 100644 (file)
@@ -1,6 +1,6 @@
 /* Part of CPP library.  File handling.
    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
    Written by Per Bothner, 1994.
    Based on CCCP program by Paul Rubin, June 1986
@@ -106,9 +106,6 @@ struct _cpp_file
 
   /* If BUFFER above contains the true contents of the file.  */
   bool buffer_valid;
-
-  /* File is a PCH (on return from find_include_file).  */
-  bool pch;
 };
 
 /* A singly-linked list for all searches for a given file name, with
@@ -322,9 +319,7 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
            }
          closedir (pchdir);
        }
-      if (valid)
-       file->pch = true;
-      else
+      if (!valid)
        *invalid_pch = true;
     }
 
@@ -703,11 +698,12 @@ should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
     return false;
 
   /* Handle PCH files immediately; don't stack them.  */
-  if (file->pch)
+  if (file->pchname)
     {
       pfile->cb.read_pch (pfile, file->pchname, file->fd, file->path);
-      close (file->fd);
       file->fd = -1;
+      free ((void *) file->pchname);
+      file->pchname = NULL;
       return false;
     }
 
@@ -916,7 +912,7 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
      complicates LAST_SOURCE_LINE_LOCATION.  This does not apply if we
      found a PCH file (in which case linemap_add is not called) or we
      were included from the command-line.  */
-  if (! file->pch && file->err_no == 0 && type != IT_CMDLINE)
+  if (file->pchname == NULL && file->err_no == 0 && type != IT_CMDLINE)
     pfile->line_table->highest_location--;
 
   return _cpp_stack_file (pfile, file, type == IT_IMPORT);