libcpp: Tweak to missing #include source location
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 22 Jun 2016 15:29:21 +0000 (15:29 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Wed, 22 Jun 2016 15:29:21 +0000 (15:29 +0000)
This patch tweaks the error message location for missing header files.

Previously these read:

test.c:1:17: fatal error: 404.h: No such file or directory
 #include "404.h"
                 ^
compilation terminated.

With this patch, the pertinent string is underlined:

test.c:1:10: fatal error: 404.h: No such file or directory
 #include "404.h"
          ^~~~~~~
compilation terminated.

gcc/testsuite/ChangeLog:
* c-c++-common/missing-header-1.c: New test case.
* c-c++-common/missing-header-2.c: New test case.
* c-c++-common/missing-header-3.c: New test case.
* c-c++-common/missing-header-4.c: New test case.

libcpp/ChangeLog:
* directives.c (do_include_common): Pass on "location" to
_cpp_stack_include.
* errors.c (cpp_diagnostic): Reimplement in terms of...
(cpp_diagnostic_at): New function.
(cpp_error_at): New function.
(cpp_errno_filename): Add "loc" param and use it by using
cpp_error_at rather than cpp_error.
* files.c (find_file_in_dir): Add "loc" param and pass it to
open_file_failed.
(_cpp_find_file): Add "loc" param.  Use it to convert calls to
cpp_error to cpp_error_at, and pass it to find_file_in_dir and
open_file_failed.
(read_file_guts): Add "loc" param.  Use it to convert calls to
cpp_error to cpp_error_at.  Pass it to cpp_errno_filename.
(read_file): Add "loc" param.  Pass it to open_file_failed and
read_file_guts.
(should_stack_file): Add "loc" param.  Pass it to read_file.
(_cpp_stack_file): Add "loc" param.  Pass it to should_stack_file.
(_cpp_stack_include): Add "loc" param.  Pass it to
_cpp_find_file and _cpp_stack_file.
(open_file_failed): Add "loc" param.  Pass it to
cpp_errno_filename.
(_cpp_fake_include): Add 0 as a source_location in call to
_cpp_find_file.
(_cpp_compare_file_date): Likewise.
(cpp_push_include): Likewise for call to _cpp_stack_include.
(cpp_push_default_include): Likewise.
(_cpp_save_file_entries): Likewise for call to open_file_failed.
(_cpp_has_header): Likewise for call to _cpp_find_file.
* include/cpplib.h (cpp_errno_filename): Add source_location
param.
(cpp_error_at): New declaration.
* init.c (cpp_read_main_file): Add 0 as a source_location in calls
to _cpp_find_file and _cpp_stack_file.
* internal.h (_cpp_find_file): Add source_location param.
(_cpp_stack_file): Likewise.
(_cpp_stack_include): Likewise.

From-SVN: r237715

12 files changed:
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/missing-header-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/missing-header-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/missing-header-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/missing-header-4.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/directives.c
libcpp/errors.c
libcpp/files.c
libcpp/include/cpplib.h
libcpp/init.c
libcpp/internal.h

index 2082fff71c9ffb316f6856c408f07336cce5149f..9c5402232a85f684f6206dd12d649744763f8ae6 100644 (file)
@@ -1,3 +1,10 @@
+2016-06-22  David Malcolm  <dmalcolm@redhat.com>
+
+       * c-c++-common/missing-header-1.c: New test case.
+       * c-c++-common/missing-header-2.c: New test case.
+       * c-c++-common/missing-header-3.c: New test case.
+       * c-c++-common/missing-header-4.c: New test case.
+
 2016-06-22  David Malcolm  <dmalcolm@redhat.com>
 
        PR c/70339
diff --git a/gcc/testsuite/c-c++-common/missing-header-1.c b/gcc/testsuite/c-c++-common/missing-header-1.c
new file mode 100644 (file)
index 0000000..30e92ad
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-options "-fdiagnostics-show-caret" } */
+#include "this-file-does-not-exist.h" /* { dg-error "10: this-file-does-not-exist.h: No such file or directory" } */
+
+/* { dg-begin-multiline-output "" }
+ #include "this-file-does-not-exist.h"
+          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
+compilation terminated.
+   { dg-end-multiline-output "" } */
diff --git a/gcc/testsuite/c-c++-common/missing-header-2.c b/gcc/testsuite/c-c++-common/missing-header-2.c
new file mode 100644 (file)
index 0000000..a634703
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-options "-fdiagnostics-show-caret" } */
+#include <this-file-does-not-exist.h> /* { dg-error "10: this-file-does-not-exist.h: No such file or directory" } */
+
+/* { dg-begin-multiline-output "" }
+ #include <this-file-does-not-exist.h>
+          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
+compilation terminated.
+   { dg-end-multiline-output "" } */
diff --git a/gcc/testsuite/c-c++-common/missing-header-3.c b/gcc/testsuite/c-c++-common/missing-header-3.c
new file mode 100644 (file)
index 0000000..4147367
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-options "-fdiagnostics-show-caret -Wno-deprecated" } */
+#import <this-file-does-not-exist.h> /* { dg-error "9: this-file-does-not-exist.h: No such file or directory" } */
+
+/* { dg-begin-multiline-output "" }
+ #import <this-file-does-not-exist.h>
+         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
+compilation terminated.
+   { dg-end-multiline-output "" } */
diff --git a/gcc/testsuite/c-c++-common/missing-header-4.c b/gcc/testsuite/c-c++-common/missing-header-4.c
new file mode 100644 (file)
index 0000000..d528d0d
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-options "-fdiagnostics-show-caret -Wno-deprecated" } */
+#import "this-file-does-not-exist.h" /* { dg-error "9: this-file-does-not-exist.h: No such file or directory" } */
+
+/* { dg-begin-multiline-output "" }
+ #import "this-file-does-not-exist.h"
+         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
+compilation terminated.
+   { dg-end-multiline-output "" } */
index 65bfe2612e2f836ac5466855a549b4afe063bd57..7695a4259119ccd532c62cf0ecbc08662ca6fbae 100644 (file)
@@ -1,3 +1,43 @@
+2016-06-22  David Malcolm  <dmalcolm@redhat.com>
+
+       * directives.c (do_include_common): Pass on "location" to
+       _cpp_stack_include.
+       * errors.c (cpp_diagnostic): Reimplement in terms of...
+       (cpp_diagnostic_at): New function.
+       (cpp_error_at): New function.
+       (cpp_errno_filename): Add "loc" param and use it by using
+       cpp_error_at rather than cpp_error.
+       * files.c (find_file_in_dir): Add "loc" param and pass it to
+       open_file_failed.
+       (_cpp_find_file): Add "loc" param.  Use it to convert calls to
+       cpp_error to cpp_error_at, and pass it to find_file_in_dir and
+       open_file_failed.
+       (read_file_guts): Add "loc" param.  Use it to convert calls to
+       cpp_error to cpp_error_at.  Pass it to cpp_errno_filename.
+       (read_file): Add "loc" param.  Pass it to open_file_failed and
+       read_file_guts.
+       (should_stack_file): Add "loc" param.  Pass it to read_file.
+       (_cpp_stack_file): Add "loc" param.  Pass it to should_stack_file.
+       (_cpp_stack_include): Add "loc" param.  Pass it to
+       _cpp_find_file and _cpp_stack_file.
+       (open_file_failed): Add "loc" param.  Pass it to
+       cpp_errno_filename.
+       (_cpp_fake_include): Add 0 as a source_location in call to
+       _cpp_find_file.
+       (_cpp_compare_file_date): Likewise.
+       (cpp_push_include): Likewise for call to _cpp_stack_include.
+       (cpp_push_default_include): Likewise.
+       (_cpp_save_file_entries): Likewise for call to open_file_failed.
+       (_cpp_has_header): Likewise for call to _cpp_find_file.
+       * include/cpplib.h (cpp_errno_filename): Add source_location
+       param.
+       (cpp_error_at): New declaration.
+       * init.c (cpp_read_main_file): Add 0 as a source_location in calls
+       to _cpp_find_file and _cpp_stack_file.
+       * internal.h (_cpp_find_file): Add source_location param.
+       (_cpp_stack_file): Likewise.
+       (_cpp_stack_include): Likewise.
+
 2016-06-22  David Malcolm  <dmalcolm@redhat.com>
 
        * include/line-map.h (fixit_hint::get_start_loc): New pure virtual
index 1617ff61c3c37257c396dec6c50f3a578c843310..772b835804bd997c3c7ea457bf3e9b5c379740bc 100644 (file)
@@ -818,7 +818,7 @@ do_include_common (cpp_reader *pfile, enum include_type type)
                           pfile->directive->name, fname, angle_brackets,
                           buf);
 
-      _cpp_stack_include (pfile, fname, angle_brackets, type);
+      _cpp_stack_include (pfile, fname, angle_brackets, type, location);
     }
 
   XDELETEVEC (fname);
index 984737877be5e7827f0e515380b7f6298ff2e85f..f7d411226eeec215c4f685ca1aa0dbbcfc2cb882 100644 (file)
@@ -27,6 +27,24 @@ along with this program; see the file COPYING3.  If not see
 #include "cpplib.h"
 #include "internal.h"
 
+/* Print a diagnostic at the given location.  */
+
+ATTRIBUTE_FPTR_PRINTF(5,0)
+static bool
+cpp_diagnostic_at (cpp_reader * pfile, int level, int reason,
+                  source_location src_loc,
+                  const char *msgid, va_list *ap)
+{
+  bool ret;
+
+  if (!pfile->cb.error)
+    abort ();
+  rich_location richloc (pfile->line_table, src_loc);
+  ret = pfile->cb.error (pfile, level, reason, &richloc, _(msgid), ap);
+
+  return ret;
+}
+
 /* Print a diagnostic at the location of the previously lexed token.  */
 
 ATTRIBUTE_FPTR_PRINTF(4,0)
@@ -35,7 +53,6 @@ cpp_diagnostic (cpp_reader * pfile, int level, int reason,
                 const char *msgid, va_list *ap)
 {
   source_location src_loc;
-  bool ret;
 
   if (CPP_OPTION (pfile, traditional))
     {
@@ -54,13 +71,7 @@ cpp_diagnostic (cpp_reader * pfile, int level, int reason,
     {
       src_loc = pfile->cur_token[-1].src_loc;
     }
-
-  if (!pfile->cb.error)
-    abort ();
-  rich_location richloc (pfile->line_table, src_loc);
-  ret = pfile->cb.error (pfile, level, reason, &richloc, _(msgid), ap);
-
-  return ret;
+  return cpp_diagnostic_at (pfile, level, reason, src_loc, msgid, ap);
 }
 
 /* Print a warning or error, depending on the value of LEVEL.  */
@@ -225,6 +236,25 @@ cpp_warning_with_line_syshdr (cpp_reader *pfile, int reason,
   return ret;
 }
 
+/* As cpp_error, but use SRC_LOC as the location of the error, without
+   a column override.  */
+
+bool
+cpp_error_at (cpp_reader * pfile, int level, source_location src_loc,
+             const char *msgid, ...)
+{
+  va_list ap;
+  bool ret;
+
+  va_start (ap, msgid);
+
+  ret = cpp_diagnostic_at (pfile, level, CPP_W_NONE, src_loc,
+                          msgid, &ap);
+
+  va_end (ap);
+  return ret;
+}
+
 /* Print a warning or error, depending on the value of LEVEL.  Include
    information from errno.  */
 
@@ -239,10 +269,12 @@ cpp_errno (cpp_reader *pfile, int level, const char *msgid)
    that is not localized, but "" is replaced with localized "stdout".  */
 
 bool
-cpp_errno_filename (cpp_reader *pfile, int level, const char *filename)
+cpp_errno_filename (cpp_reader *pfile, int level, const char *filename,
+                   source_location loc)
 {
   if (filename[0] == '\0')
     filename = _("stdout");
 
-  return cpp_error (pfile, level, "%s: %s", filename, xstrerror (errno));
+  return cpp_error_at (pfile, level, loc, "%s: %s", filename,
+                      xstrerror (errno));
 }
index 5aa8d1ac9bbec5352990b8a777b7858edf4e451d..c8bb637fb58c3700c60ee67c1e629315e3d98f1c 100644 (file)
@@ -171,14 +171,18 @@ static bool open_file (_cpp_file *file);
 static bool pch_open_file (cpp_reader *pfile, _cpp_file *file,
                           bool *invalid_pch);
 static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file,
-                             bool *invalid_pch);
-static bool read_file_guts (cpp_reader *pfile, _cpp_file *file);
-static bool read_file (cpp_reader *pfile, _cpp_file *file);
-static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import);
+                             bool *invalid_pch, source_location loc);
+static bool read_file_guts (cpp_reader *pfile, _cpp_file *file,
+                           source_location loc);
+static bool read_file (cpp_reader *pfile, _cpp_file *file,
+                      source_location loc);
+static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import,
+                              source_location loc);
 static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
                                 int angle_brackets, enum include_type);
 static const char *dir_name_of_file (_cpp_file *file);
-static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int);
+static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int,
+                             source_location);
 static struct cpp_file_hash_entry *search_cache (struct cpp_file_hash_entry *head,
                                             const cpp_dir *start_dir);
 static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
@@ -368,10 +372,12 @@ maybe_shorter_path (const char * file)
 /* 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.
-   Set *INVALID_PCH to true if a PCH file is found but wasn't valid.  */
+   Set *INVALID_PCH to true if a PCH file is found but wasn't valid.
+   Use LOC when emitting any diagnostics.  */
 
 static bool
-find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
+find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch,
+                 source_location loc)
 {
   char *path;
 
@@ -424,7 +430,7 @@ find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
 
       if (file->err_no != ENOENT)
        {
-         open_file_failed (pfile, file, 0);
+         open_file_failed (pfile, file, 0, loc);
          return true;
        }
 
@@ -495,10 +501,13 @@ _cpp_find_failed (_cpp_file *file)
    If IMPLICIT_PREINCLUDE then it is OK for the file to be missing.
    If present, it is OK for a precompiled header to be included after
    it.
-*/
+
+   Use LOC as the location for any errors.  */
+
 _cpp_file *
 _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
-               bool fake, int angle_brackets, bool implicit_preinclude)
+               bool fake, int angle_brackets, bool implicit_preinclude,
+               source_location loc)
 {
   struct cpp_file_hash_entry *entry;
   void **hash_slot;
@@ -510,7 +519,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
 
   /* Ensure we get no confusion between cached files and directories.  */
   if (start_dir == NULL)
-    cpp_error (pfile, CPP_DL_ICE, "NULL directory in find_file");
+    cpp_error_at (pfile, CPP_DL_ICE, loc, "NULL directory in find_file");
 
   hash_slot
     = htab_find_slot_with_hash (pfile->file_hash, fname,
@@ -530,7 +539,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
   /* Try each path in the include chain.  */
   for (; !fake ;)
     {
-      if (find_file_in_dir (pfile, file, &invalid_pch))
+      if (find_file_in_dir (pfile, file, &invalid_pch, loc))
        break;
 
       file->dir = file->dir->next;
@@ -579,7 +588,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
              return NULL;
            }
          else
-           open_file_failed (pfile, file, angle_brackets);
+           open_file_failed (pfile, file, angle_brackets, loc);
          break;
        }
 
@@ -658,9 +667,11 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
    except for plain files and block devices, since there is no
    reliable portable way of doing this.
 
+   Use LOC for any diagnostics.
+
    FIXME: Flush file cache and try again if we run out of memory.  */
 static bool
-read_file_guts (cpp_reader *pfile, _cpp_file *file)
+read_file_guts (cpp_reader *pfile, _cpp_file *file, source_location loc)
 {
   ssize_t size, total, count;
   uchar *buf;
@@ -668,7 +679,8 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
 
   if (S_ISBLK (file->st.st_mode))
     {
-      cpp_error (pfile, CPP_DL_ERROR, "%s is a block device", file->path);
+      cpp_error_at (pfile, CPP_DL_ERROR, loc,
+                   "%s is a block device", file->path);
       return false;
     }
 
@@ -685,7 +697,8 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
         does not bite us.  */
       if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
        {
-         cpp_error (pfile, CPP_DL_ERROR, "%s is too large", file->path);
+         cpp_error_at (pfile, CPP_DL_ERROR, loc,
+                       "%s is too large", file->path);
          return false;
        }
 
@@ -718,13 +731,13 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
 
   if (count < 0)
     {
-      cpp_errno_filename (pfile, CPP_DL_ERROR, file->path);
+      cpp_errno_filename (pfile, CPP_DL_ERROR, file->path, loc);
       free (buf);
       return false;
     }
 
   if (regular && total != size && STAT_SIZE_RELIABLE (file->st))
-    cpp_error (pfile, CPP_DL_WARNING,
+    cpp_error_at (pfile, CPP_DL_WARNING, loc,
               "%s is shorter than expected", file->path);
 
   file->buffer = _cpp_convert_input (pfile,
@@ -739,9 +752,10 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
 
 /* Convenience wrapper around read_file_guts that opens the file if
    necessary and closes the file descriptor after reading.  FILE must
-   have been passed through find_file() at some stage.  */
+   have been passed through find_file() at some stage.  Use LOC for
+   any diagnostics.  */
 static bool
-read_file (cpp_reader *pfile, _cpp_file *file)
+read_file (cpp_reader *pfile, _cpp_file *file, source_location loc)
 {
   /* If we already have its contents in memory, succeed immediately.  */
   if (file->buffer_valid)
@@ -753,11 +767,11 @@ read_file (cpp_reader *pfile, _cpp_file *file)
 
   if (file->fd == -1 && !open_file (file))
     {
-      open_file_failed (pfile, file, 0);
+      open_file_failed (pfile, file, 0, loc);
       return false;
     }
 
-  file->dont_read = !read_file_guts (pfile, file);
+  file->dont_read = !read_file_guts (pfile, file, loc);
   close (file->fd);
   file->fd = -1;
 
@@ -765,9 +779,11 @@ read_file (cpp_reader *pfile, _cpp_file *file)
 }
 
 /* Returns TRUE if FILE's contents have been successfully placed in
-   FILE->buffer and the file should be stacked, otherwise false.  */
+   FILE->buffer and the file should be stacked, otherwise false.
+   Use LOC for any diagnostics.  */
 static bool
-should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
+should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import,
+                  source_location loc)
 {
   _cpp_file *f;
 
@@ -802,7 +818,7 @@ should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
       return false;
     }
 
-  if (!read_file (pfile, file))
+  if (!read_file (pfile, file, loc))
     return false;
 
   /* Check the file against the PCH file.  This is done before
@@ -849,7 +865,7 @@ should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
            /* The file is not stacked anymore.  We can reuse it.  */
            ref_file = f;
 
-         same_file_p = read_file (pfile, ref_file)
+         same_file_p = read_file (pfile, ref_file, loc)
                        /* Size might have changed in read_file().  */
                        && ref_file->st.st_size == file->st.st_size
                        && !memcmp (ref_file->buffer,
@@ -873,14 +889,15 @@ should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
 /* Place the file referenced by FILE into a new buffer on the buffer
    stack if possible.  IMPORT is true if this stacking attempt is
    because of a #import directive.  Returns true if a buffer is
-   stacked.  */
+   stacked.  Use LOC for any diagnostics.  */
 bool
-_cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
+_cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import,
+                source_location loc)
 {
   cpp_buffer *buffer;
   int sysp;
 
-  if (!should_stack_file (pfile, file, import))
+  if (!should_stack_file (pfile, file, import, loc))
       return false;
 
   if (pfile->buffer == NULL || file->dir == NULL)
@@ -990,7 +1007,7 @@ dir_name_of_file (_cpp_file *file)
    Returns true if a buffer was stacked.  */
 bool
 _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
-                   enum include_type type)
+                   enum include_type type, source_location loc)
 {
   struct cpp_dir *dir;
   _cpp_file *file;
@@ -1013,7 +1030,7 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
     return false;
 
   file = _cpp_find_file (pfile, fname, dir, false, angle_brackets,
-                        type == IT_DEFAULT);
+                        type == IT_DEFAULT, loc);
   if (type == IT_DEFAULT && file == NULL)
     return false;
 
@@ -1029,7 +1046,7 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
       && type != IT_CMDLINE && type != IT_DEFAULT)
     pfile->line_table->highest_location--;
 
-  stacked = _cpp_stack_file (pfile, file, type == IT_IMPORT);
+  stacked = _cpp_stack_file (pfile, file, type == IT_IMPORT, loc);
 
   if (!stacked)
     /* _cpp_stack_file didn't stack the file, so let's rollback the
@@ -1041,7 +1058,8 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
 
 /* Could not open FILE.  The complication is dependency output.  */
 static void
-open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets)
+open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets,
+                 source_location loc)
 {
   int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
   bool print_dep = CPP_OPTION (pfile, deps.style) > (angle_brackets || !!sysp);
@@ -1057,7 +1075,8 @@ open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets)
          being used, we must also flag an error.  */
       if (CPP_OPTION (pfile, deps.need_preprocessor_output))
        cpp_errno_filename (pfile, CPP_DL_FATAL,
-                           file->path ? file->path : file->name);
+                           file->path ? file->path : file->name,
+                           loc);
     }
   else
     {
@@ -1072,10 +1091,12 @@ open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets)
           || print_dep
           || CPP_OPTION (pfile, deps.need_preprocessor_output))
        cpp_errno_filename (pfile, CPP_DL_FATAL,
-                           file->path ? file->path : file->name);
+                           file->path ? file->path : file->name,
+                           loc);
       else
        cpp_errno_filename (pfile, CPP_DL_WARNING,
-                           file->path ? file->path : file->name);
+                           file->path ? file->path : file->name,
+                           loc);
     }
 }
 
@@ -1323,7 +1344,7 @@ cpp_clear_file_cache (cpp_reader *pfile)
 void
 _cpp_fake_include (cpp_reader *pfile, const char *fname)
 {
-  _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true, 0, false);
+  _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true, 0, false, 0);
 }
 
 /* Not everyone who wants to set system-header-ness on a buffer can
@@ -1441,7 +1462,7 @@ _cpp_compare_file_date (cpp_reader *pfile, const char *fname,
   if (!dir)
     return -1;
 
-  file = _cpp_find_file (pfile, fname, dir, false, angle_brackets, false);
+  file = _cpp_find_file (pfile, fname, dir, false, angle_brackets, false, 0);
   if (file->err_no)
     return -1;
 
@@ -1459,7 +1480,7 @@ _cpp_compare_file_date (cpp_reader *pfile, const char *fname,
 bool
 cpp_push_include (cpp_reader *pfile, const char *fname)
 {
-  return _cpp_stack_include (pfile, fname, false, IT_CMDLINE);
+  return _cpp_stack_include (pfile, fname, false, IT_CMDLINE, 0);
 }
 
 /* Pushes the given file, implicitly included at the start of a
@@ -1468,7 +1489,7 @@ cpp_push_include (cpp_reader *pfile, const char *fname)
 bool
 cpp_push_default_include (cpp_reader *pfile, const char *fname)
 {
-  return _cpp_stack_include (pfile, fname, true, IT_DEFAULT);
+  return _cpp_stack_include (pfile, fname, true, IT_DEFAULT, 0);
 }
 
 /* Do appropriate cleanup when a file INC's buffer is popped off the
@@ -1853,7 +1874,7 @@ _cpp_save_file_entries (cpp_reader *pfile, FILE *fp)
 
          if (!open_file (f))
            {
-             open_file_failed (pfile, f, 0);
+             open_file_failed (pfile, f, 0, 0);
              free (result);
              return false;
            }
@@ -1980,7 +2001,7 @@ _cpp_has_header (cpp_reader *pfile, const char *fname, int angle_brackets,
   cpp_dir *start_dir = search_path_head (pfile, fname, angle_brackets, type);
   _cpp_file *file = _cpp_find_file (pfile, fname, start_dir,
                                    /*fake=*/false, angle_brackets,
-                                   /*implicit_preinclude=*/false);
+                                   /*implicit_preinclude=*/false, 0);
   return file->err_no != ENOENT;
 }
 
index 9d70cc856effd7ad1cc8094ae137cc2e62a5b19c..543f3b971531becd46755014c6481474cf687ae8 100644 (file)
@@ -992,7 +992,8 @@ extern bool cpp_warning_syshdr (cpp_reader *, int, const char *msgid, ...)
 extern bool cpp_errno (cpp_reader *, int, const char *msgid);
 /* Similarly, but with "FILENAME: " instead of "MSGID: ", where
    the filename is not localized.  */
-extern bool cpp_errno_filename (cpp_reader *, int, const char *filename);
+extern bool cpp_errno_filename (cpp_reader *, int, const char *filename,
+                               source_location loc);
 
 /* Same as cpp_error, except additionally specifies a position as a
    (translation unit) physical line and physical column.  If the line is
@@ -1010,6 +1011,10 @@ extern bool cpp_warning_with_line_syshdr (cpp_reader *, int, source_location,
                                           unsigned, const char *msgid, ...)
   ATTRIBUTE_PRINTF_5;
 
+extern bool cpp_error_at (cpp_reader * pfile, int level,
+                         source_location src_loc, const char *msgid, ...)
+  ATTRIBUTE_PRINTF_4;
+
 /* In lex.c */
 extern int cpp_ideq (const cpp_token *, const char *);
 extern void cpp_output_line (cpp_reader *, FILE *);
index e78b3206defa09c57e31e329cbed8eef4a27496f..2df8cfb73c3093618bf213a8a3faab5ae54b3038 100644 (file)
@@ -616,6 +616,8 @@ cpp_post_options (cpp_reader *pfile)
 const char *
 cpp_read_main_file (cpp_reader *pfile, const char *fname)
 {
+  const source_location loc = 0;
+
   if (CPP_OPTION (pfile, deps.style) != DEPS_NONE)
     {
       if (!pfile->deps)
@@ -626,11 +628,12 @@ cpp_read_main_file (cpp_reader *pfile, const char *fname)
     }
 
   pfile->main_file
-    = _cpp_find_file (pfile, fname, &pfile->no_search_path, false, 0, false);
+    = _cpp_find_file (pfile, fname, &pfile->no_search_path, false, 0, false,
+                     loc);
   if (_cpp_find_failed (pfile->main_file))
     return NULL;
 
-  _cpp_stack_file (pfile, pfile->main_file, false);
+  _cpp_stack_file (pfile, pfile->main_file, false, loc);
 
   /* For foo.i, read the original filename foo.c now, for the benefit
      of the front ends.  */
index cea32ec73c62961b3d552a3e0c7b4fb8873638cf..ca2b4988cf6f71e64f2c6dca506a82bba20dc4b0 100644 (file)
@@ -645,13 +645,14 @@ extern void _cpp_destroy_hashtable (cpp_reader *);
 /* In files.c */
 typedef struct _cpp_file _cpp_file;
 extern _cpp_file *_cpp_find_file (cpp_reader *, const char *, cpp_dir *,
-                                 bool, int, bool);
+                                 bool, int, bool, source_location);
 extern bool _cpp_find_failed (_cpp_file *);
 extern void _cpp_mark_file_once_only (cpp_reader *, struct _cpp_file *);
 extern void _cpp_fake_include (cpp_reader *, const char *);
-extern bool _cpp_stack_file (cpp_reader *, _cpp_file*, bool);
+extern bool _cpp_stack_file (cpp_reader *, _cpp_file*, bool,
+                            source_location);
 extern bool _cpp_stack_include (cpp_reader *, const char *, int,
-                               enum include_type);
+                               enum include_type, source_location);
 extern int _cpp_compare_file_date (cpp_reader *, const char *, int);
 extern void _cpp_report_missing_guards (cpp_reader *);
 extern void _cpp_init_files (cpp_reader *);