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
parent a7b8107f
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.
......
...@@ -341,6 +341,25 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch) ...@@ -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) ...@@ -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;
......
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