re PR c++/52974 (Canonicalize include paths in diagnostics)
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Mon, 30 Apr 2012 16:57:22 +0000 (16:57 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Mon, 30 Apr 2012 16:57:22 +0000 (16:57 +0000)
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

libcpp/ChangeLog
libcpp/files.c

index 271148cc07d064b73103e3b275389899dee93fde..8ab26a92aedc3e177ad4c4e3a65c0ec39ffb296f 100644 (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>
 
        Switch -ftrack-macro-expansion=2 on by default.
index 29ccf3b701390b44f67d95dc3d7fd1f4e3cae161..5b3a37b0279300466924a2745b9a83d37a4679b0 100644 (file)
@@ -341,6 +341,25 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
   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
    where remap and PCH intercept the file lookup process.  Return true
    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)
     {
-      hashval_t hv = htab_hash_string (path);
+      hashval_t hv;
       char *copy;
       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)
        {
          file->err_no = ENOENT;