re PR preprocessor/20348 (File not included when file with same name is included before)

PR preprocessor/20348
	PR preprocessor/20356
	* files.c (_cpp_find_file, search_cache): Revert 2004-06-26 and
	2004-06-05 changes.

	* gcc.dg/cpp/pr20348.c: New test.
	* gcc.dg/cpp/pr20348.h: New file.
	* gcc.dg/cpp/inc/pr20348.h: New file.
	* gcc.dg/cpp/inc/pr20348-aux.h: New file.
	* gcc.dg/cpp/pr20356.c: New test.
	* gcc.dg/cpp/pr20356.h: New file.
	* gcc.dg/cpp/inc/pr20356.h: New file.
	* gcc.dg/cpp/inc/pr20356-aux.h: New file.

From-SVN: r103629
This commit is contained in:
Jakub Jelinek 2005-08-30 08:28:21 +02:00 committed by Jakub Jelinek
parent 4dc0796f75
commit f5eab47e10
11 changed files with 106 additions and 51 deletions

View file

@ -1,3 +1,16 @@
2005-08-30 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/20348
PR preprocessor/20356
* gcc.dg/cpp/pr20348.c: New test.
* gcc.dg/cpp/pr20348.h: New file.
* gcc.dg/cpp/inc/pr20348.h: New file.
* gcc.dg/cpp/inc/pr20348-aux.h: New file.
* gcc.dg/cpp/pr20356.c: New test.
* gcc.dg/cpp/pr20356.h: New file.
* gcc.dg/cpp/inc/pr20356.h: New file.
* gcc.dg/cpp/inc/pr20356-aux.h: New file.
2005-08-29 Jerry DeLisle <jvdelisle@verizon.net>
* gfortran.fortran-torture/execute/intrinsic_count.f90:

View file

@ -0,0 +1 @@
#include "pr20348.h"

View file

@ -0,0 +1,9 @@
#ifndef MIDDLE
# ifndef INC_PR20348_H_SEEN
# define INC_PR20348_H_SEEN
# else
# error inc/pr20348.h included twice before MIDDLE definition
# endif
#else
# error inc/pr20348.h included after MIDDLE definition
#endif

View file

@ -0,0 +1 @@
#include "pr20356.h"

View file

@ -0,0 +1,6 @@
#ifndef INC_PR20356_H
# define INC_PR20356_H
#endif
#ifndef PR20356_H
# include_next <pr20356.h>
#endif

View file

@ -0,0 +1,16 @@
/* PR preprocessor/20348 */
/* { dg-do compile } */
/* { dg-options "-I$srcdir/gcc.dg/cpp -I$srcdir/gcc.dg/cpp/inc" } */
#include <pr20348-aux.h>
#define MIDDLE
#include <pr20348.h>
#ifndef PR20348_H_SEEN
# error pr20348.h not included after MIDDLE definition
#endif
#ifndef INC_PR20348_H_SEEN
# error inc/pr20348.h not included before MIDDLE definition
#endif
int i;

View file

@ -0,0 +1,9 @@
#ifdef MIDDLE
# ifndef PR20348_H_SEEN
# define PR20348_H_SEEN
# else
# error pr20348.h included twice after MIDDLE definition
# endif
#else
# error pr20348.h included before MIDDLE definition
#endif

View file

@ -0,0 +1,14 @@
/* PR preprocessor/20356 */
/* { dg-do compile } */
/* { dg-options "-I$srcdir/gcc.dg/cpp -I$srcdir/gcc.dg/cpp/inc" } */
#include <pr20356-aux.h>
#ifndef PR20356_H
# error PR20356_H not defined
#endif
#ifndef INC_PR20356_H
# error INC_PR20356_H not defined
#endif
int i;

View file

@ -0,0 +1,5 @@
#ifndef PR20356_H
# define PR20356_H
#else
# include_next <pr20356.h>
#endif

View file

@ -1,3 +1,10 @@
2005-08-30 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/20348
PR preprocessor/20356
* files.c (_cpp_find_file, search_cache): Revert 2004-06-26 and
2004-06-05 changes.
2005-07-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* configure.ac (ACX_PROG_CC_WARNING_OPTS): add

View file

@ -416,21 +416,6 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
/* Try each path in the include chain. */
for (; !fake ;)
{
if (file->dir == pfile->quote_include
|| file->dir == pfile->bracket_include)
{
entry = search_cache (*hash_slot, file->dir);
if (entry)
{
/* Found the same file again. Record it as reachable
from this position, too. */
free ((char *) file->name);
free (file);
file = entry->u.file;
goto found;
}
}
if (find_file_in_dir (pfile, file, &invalid_pch))
break;
@ -459,40 +444,33 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
}
break;
}
/* Only check the cache for the starting location (done above)
and the quote and bracket chain heads because there are no
other possible starting points for searches. */
if (file->dir != pfile->bracket_include
&& file->dir != pfile->quote_include)
continue;
entry = search_cache (*hash_slot, file->dir);
if (entry)
break;
}
/* This is a new file; put it in the list. */
file->next_file = pfile->all_files;
pfile->all_files = file;
/* If this file was found in the directory-of-the-current-file,
check whether that directory is reachable via one of the normal
search paths. If so, we must record this entry as being
reachable that way, otherwise we will mistakenly reprocess this
file if it is included later from the normal search path. */
if (file->dir && start_dir->next == pfile->quote_include)
if (entry)
{
cpp_dir *d;
cpp_dir *proper_start_dir = pfile->quote_include;
for (d = proper_start_dir;; d = d->next)
{
if (d == pfile->bracket_include)
proper_start_dir = d;
if (d == 0)
{
proper_start_dir = 0;
break;
}
/* file->dir->name will have a trailing slash. */
if (!strncmp (d->name, file->dir->name, file->dir->len - 1))
break;
}
if (proper_start_dir)
start_dir = proper_start_dir;
/* Cache for START_DIR too, sharing the _cpp_file structure. */
free ((char *) file->name);
free (file);
file = entry->u.file;
}
else
{
/* This is a new file; put it in the list. */
file->next_file = pfile->all_files;
pfile->all_files = file;
}
found:
/* Store this new result in the hash table. */
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
@ -880,14 +858,10 @@ 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)
{
struct file_hash_entry *p;
while (head && head->start_dir != start_dir)
head = head->next;
/* Look for a file that was found from a search starting at the
given location. */
for (p = head; p; p = p->next)
if (p->start_dir == start_dir)
return p;
return 0;
return head;
}
/* Allocate a new _cpp_file structure. */