diagnostic.c (output_format): Recognize "%H" as a format specifier for a location_t.
authorGabriel Dos Reis <gdr@codesourcery.com>
Thu, 13 Jun 2002 12:40:54 +0000 (12:40 +0000)
committerGabriel Dos Reis <gdr@gcc.gnu.org>
Thu, 13 Jun 2002 12:40:54 +0000 (12:40 +0000)
* diagnostic.c (output_format): Recognize "%H" as a format
specifier for a location_t.
(text_specifies_location): New function.
(diagnostic_set_info): Use it.

From-SVN: r54584

gcc/ChangeLog
gcc/diagnostic.c

index d14b1ab031662e5bde055ea834b12ccf3277da95..f89e38770fb8ef284d5f34ef0e567c22c5bf8758 100644 (file)
@@ -1,3 +1,10 @@
+2002-06-13  Gabriel Dos Reis  <gdr@codesourcery.com>
+
+       * diagnostic.c (output_format): Recognize "%H" as a format
+       specifier for a location_t.
+       (text_specifies_location): New function.
+       (diagnostic_set_info): Use it.
+
 2002-06-13  Jeffrey Law  <law@redhat.com>
 
        * i386.md (extenddfxf2, extenddftf2): Fix typo/thinko.
index fd4462aedf05b3936cd790a1e7c6e71cd3570c02..3132a3d61060f1df9a83415bd988256cbdae0953 100644 (file)
@@ -89,6 +89,7 @@ static void default_diagnostic_finalizer PARAMS ((diagnostic_context *,
                                                   diagnostic_info *));
 
 static void error_recursion PARAMS ((diagnostic_context *)) ATTRIBUTE_NORETURN;
+static bool text_specifies_location PARAMS ((text_info *, location_t *));
 
 extern int rtl_dump_and_exit;
 extern int warnings_are_errors;
@@ -495,7 +496,8 @@ output_buffer_to_stream (buffer)
    %c: character.
    %s: string.
    %%: `%'.
-   %*.s: a substring the length of which is specified by an integer.  */
+   %*.s: a substring the length of which is specified by an integer.
+   %H: location_t.  */
 static void
 output_format (buffer, text)
      output_buffer *buffer;
@@ -576,6 +578,16 @@ output_format (buffer, text)
          output_add_character (buffer, '%');
          break;
 
+        case 'H':
+          {
+            const location_t *locus = va_arg (*text->args_ptr, location_t *);
+            output_add_string (buffer, "file '");
+            output_add_string (buffer, locus->file);
+            output_add_string (buffer, "', line ");
+            output_decimal (buffer, locus->file);
+          }
+          break;
+
        case '.':
          {
            int n;
@@ -769,6 +781,30 @@ diagnostic_initialize (context)
   context->warnings_are_errors_message = warnings_are_errors;
 }
 
+/* Returns true if the next format specifier in TEXT is a format specifier
+   for a location_t.  If so, update the object pointed by LOCUS to reflect
+   the specified location in *TEXT->args_ptr.  */
+static bool
+text_specifies_location (text, locus)
+     text_info *text;
+     location_t *locus;
+{
+  const char *p;
+  /* Skip any leading text.  */
+  for (p = text->format_spec; *p && *p != '%'; ++p)
+    ;
+
+  /* Extract the location information if any.  */
+  if (*p == '%' && *++p == 'H')
+    {
+      *locus = *va_arg (*text->args_ptr, location_t *);
+      text->format_spec = p + 1;
+      return true;
+    }
+
+  return false;
+}
+
 void
 diagnostic_set_info (diagnostic, msgid, args, file, line, kind)
      diagnostic_info *diagnostic;
@@ -780,8 +816,13 @@ diagnostic_set_info (diagnostic, msgid, args, file, line, kind)
 {
   diagnostic->message.format_spec = msgid;
   diagnostic->message.args_ptr = args;
-  diagnostic->location.file = file;
-  diagnostic->location.line = line;
+  /* If the diagnostic message doesn't specify a loccation,
+     use FILE and LINE.  */
+  if (!text_specifies_location (&diagnostic->message, &diagnostic->location))
+    {
+      diagnostic->location.file = file;
+      diagnostic->location.line = line;
+    }
   diagnostic->kind = kind;
 }