Commit f5eab47e by Jakub Jelinek Committed by Jakub Jelinek

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
parent 4dc0796f
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:
......
#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
#ifndef INC_PR20356_H
# define INC_PR20356_H
#endif
#ifndef PR20356_H
# include_next <pr20356.h>
#endif
/* 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;
#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
/* 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;
#ifndef PR20356_H
# define PR20356_H
#else
# include_next <pr20356.h>
#endif
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
......
......@@ -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;
}
}
/* This is a new file; put it in the list. */
file->next_file = pfile->all_files;
pfile->all_files = file;
/* 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;
/* 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)
{
cpp_dir *d;
cpp_dir *proper_start_dir = pfile->quote_include;
entry = search_cache (*hash_slot, file->dir);
if (entry)
break;
}
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;
if (entry)
{
/* 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. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment