re PR c++/52974 (Canonicalize include paths in diagnostics)

2012-04-30  Manuel López-Ibáñez  <manu@gcc.gnu.org>
	    Dodji Seketeli  <dodji@seketeli.org>

	PR c++/52974
	* libcpp/files.c (maybe_shorter_path): New.
	(find_file_in_dir): Use it.

Co-Authored-By: Dodji Seketeli <dodji@seketeli.org>

From-SVN: r186991
This commit is contained in:
Manuel López-Ibáñez 2012-04-30 16:57:22 +00:00
parent a7b8107f8e
commit b193dfa899
2 changed files with 41 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2012-04-30 Manuel López-Ibáñez <manu@gcc.gnu.org>
Dodji Seketeli <dodji@seketeli.org>
PR 5297
* libcpp/files.c (maybe_shorter_path): New.
(find_file_in_dir): Use it.
2012-04-30 Dodji Seketeli <dodji@redhat.com> 2012-04-30 Dodji Seketeli <dodji@redhat.com>
Switch -ftrack-macro-expansion=2 on by default. Switch -ftrack-macro-expansion=2 on by default.

View File

@ -341,6 +341,25 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
return valid; return valid;
} }
/* Canonicalize the path to FILE. Return the canonical form if it is
shorter, otherwise return NULL. This function does NOT free the
memory pointed by FILE. */
static char *
maybe_shorter_path (const char * file)
{
char * file2 = lrealpath (file);
if (file2 && strlen (file2) < strlen (file))
{
return file2;
}
else
{
free (file2);
return NULL;
}
}
/* Try to open the path FILE->name appended to FILE->dir. This is /* Try to open the path FILE->name appended to FILE->dir. This is
where remap and PCH intercept the file lookup process. Return true where remap and PCH intercept the file lookup process. Return true
if the file was found, whether or not the open was successful. if the file was found, whether or not the open was successful.
@ -361,10 +380,24 @@ find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
if (path) if (path)
{ {
hashval_t hv = htab_hash_string (path); hashval_t hv;
char *copy; char *copy;
void **pp; void **pp;
/* We try to canonicalize system headers. */
if (file->dir->sysp)
{
char * canonical_path = maybe_shorter_path (path);
if (canonical_path)
{
/* The canonical path was newly allocated. Let's free the
non-canonical one. */
free (path);
path = canonical_path;
}
}
hv = htab_hash_string (path);
if (htab_find_with_hash (pfile->nonexistent_file_hash, path, hv) != NULL) if (htab_find_with_hash (pfile->nonexistent_file_hash, path, hv) != NULL)
{ {
file->err_no = ENOENT; file->err_no = ENOENT;