]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR preprocessor/15167 (Internal compiler error with "#pragma once")
authorEric Botcazou <ebotcazou@libertysurf.fr>
Wed, 15 Dec 2004 13:41:28 +0000 (14:41 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 15 Dec 2004 13:41:28 +0000 (13:41 +0000)
PR preprocessor/15167
* cppfiles.c (destroy_cpp_file): New function.
(should_stack_file): Make a new file if the
compared file is still stacked.

From-SVN: r92198

gcc/ChangeLog
gcc/cppfiles.c
gcc/testsuite/ChangeLog

index e7c9e34df315958b07a38b0234d3a99dafa8b579..fd71366ccf0966a2bcccba1924f9813a66c028a3 100644 (file)
@@ -1,3 +1,10 @@
+2004-12-15  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR preprocessor/15167
+       * cppfiles.c (destroy_cpp_file): New function.
+       (should_stack_file): Make a new file if the
+       compared file is still stacked.
+
 2004-12-15  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR other/18665
index 1ca793d5fb847c7ef754377608961364d8babddf..9aea34c4b365a6ec221f5634b6d6b964066c6631 100644 (file)
@@ -168,6 +168,7 @@ static void open_file_failed (cpp_reader *pfile, _cpp_file *file);
 static struct file_hash_entry *search_cache (struct file_hash_entry *head,
                                             const cpp_dir *start_dir);
 static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
+static void destroy_cpp_file (_cpp_file *);
 static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp);
 static void allocate_file_hash_entries (cpp_reader *pfile);
 static struct file_hash_entry *new_file_hash_entry (cpp_reader *pfile);
@@ -598,12 +599,38 @@ should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
       if ((import || f->once_only)
          && f->err_no == 0
          && f->st.st_mtime == file->st.st_mtime
-         && f->st.st_size == file->st.st_size
-         && read_file (pfile, f)
-         /* Size might have changed in read_file().  */
-         && f->st.st_size == file->st.st_size
-         && !memcmp (f->buffer, file->buffer, f->st.st_size))
-       break;
+         && f->st.st_size == file->st.st_size)
+       {
+         _cpp_file *ref_file;
+         bool same_file_p = false;
+
+         if (f->buffer && !f->buffer_valid)
+           {
+             /* We already have a buffer but it is not valid, because
+                the file is still stacked.  Make a new one.  */
+             ref_file = make_cpp_file (pfile, f->dir, f->name);
+             ref_file->path = f->path;
+           }
+         else
+           /* The file is not stacked anymore.  We can reuse it.  */
+           ref_file = f;
+
+         same_file_p = read_file (pfile, ref_file)
+                       /* Size might have changed in read_file().  */
+                       && ref_file->st.st_size == file->st.st_size
+                       && !memcmp (ref_file->buffer,
+                                   file->buffer,
+                                   file->st.st_size);
+
+         if (f->buffer && !f->buffer_valid)
+           {
+             ref_file->path = 0;
+             destroy_cpp_file (ref_file);
+           }
+
+         if (same_file_p)
+           break;
+       }
     }
 
   return f == NULL;
@@ -781,6 +808,16 @@ make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
   return file;
 }
 
+/* Release a _cpp_file structure.  */
+static void
+destroy_cpp_file (_cpp_file *file)
+{
+  if (file->buffer)
+    free ((void *) file->buffer);
+  free ((void *) file->name);
+  free (file);
+}
+
 /* A hash of directory names.  The directory names are the path names
    of files which contain a #include "", the included file name is
    appended to this directories.
index 3eb483878fb43fd2a1e2787b7cfaf2a52cb8b6ff..47e6a846af1611ce79d01bb59cbcfb088b3c2a4d 100644 (file)
@@ -1,3 +1,11 @@
+2004-12-15  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * cpp/pragma-once-1.c: New test.
+       * cpp/pragma-once-1b.h: Likewise.
+       * cpp/pragma-once-1c.h: Likewise.
+       * cpp/pragma-once-1d.h: Likewise.
+       * cpp/inc/pragma-once-1a.h: Likewise.
+
 2004-12-15  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * gcc.dg/ftrapv-2.c: New test.