You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
/* This file implements the language independent aspect of diagnostic
#include "diagnostic.h"
#include "langhooks.h"
#include "langhooks-def.h"
+#include "opts.h"
/* Prototypes. */
/* By default, diagnostics are sent to stderr. */
context->printer->buffer->stream = stderr;
/* By default, we emit prefixes once per message. */
- context->printer->prefixing_rule = DIAGNOSTICS_SHOW_PREFIX_ONCE;
+ context->printer->wrapping.rule = DIAGNOSTICS_SHOW_PREFIX_ONCE;
memset (context->diagnostic_count, 0, sizeof context->diagnostic_count);
context->issue_warnings_are_errors_message = true;
context->warning_as_error_requested = false;
+ context->show_option_requested = false;
context->abort_on_error = false;
context->internal_error = NULL;
diagnostic_starter (context) = default_diagnostic_starter;
}
void
-diagnostic_set_info (diagnostic_info *diagnostic, const char *msgid,
+diagnostic_set_info (diagnostic_info *diagnostic, const char *gmsgid,
va_list *args, location_t location,
diagnostic_t kind)
{
diagnostic->message.err_no = errno;
diagnostic->message.args_ptr = args;
- diagnostic->message.format_spec = _(msgid);
+ diagnostic->message.format_spec = _(gmsgid);
diagnostic->location = location;
diagnostic->kind = kind;
+ diagnostic->option_index = 0;
}
/* Return a malloc'd string describing a location. The caller is
(s.file == NULL
? build_message_string ("%s: %s", progname, text)
#ifdef USE_MAPPED_LOCATION
- : s.column != 0
+ : flag_show_column && s.column != 0
? build_message_string ("%s:%d:%d: %s", s.file, s.line, s.column, text)
#endif
: build_message_string ("%s:%d: %s", s.file, s.line, text));
",\n from %s:%d",
xloc.file, xloc.line);
}
- pp_verbatim (context->printer, ":\n");
+ pp_verbatim (context->printer, ":");
diagnostic_set_last_module (context);
+ pp_newline (context->printer);
}
}
error_recursion (context);
}
+ if (diagnostic->option_index
+ && ! option_enabled (diagnostic->option_index))
+ return;
+
context->lock++;
if (diagnostic_count_diagnostic (context, diagnostic))
{
- pp_prepare_to_format (context->printer, &diagnostic->message,
- &diagnostic->location);
+ const char *saved_format_spec = diagnostic->message.format_spec;
+
+ if (context->show_option_requested && diagnostic->option_index)
+ diagnostic->message.format_spec
+ = ACONCAT ((diagnostic->message.format_spec,
+ " [", cl_options[diagnostic->option_index].opt_text, "]", NULL));
+
+ diagnostic->message.locus = &diagnostic->location;
+ pp_format (context->printer, &diagnostic->message);
(*diagnostic_starter (context)) (context, diagnostic);
- pp_format_text (context->printer, &diagnostic->message);
+ pp_output_formatted_text (context->printer);
(*diagnostic_finalizer (context)) (context, diagnostic);
pp_flush (context->printer);
diagnostic_action_after_output (context, diagnostic);
+ diagnostic->message.format_spec = saved_format_spec;
}
context->lock--;
/* Text to be emitted verbatim to the error message stream; this
produces no prefix and disables line-wrapping. Use rarely. */
void
-verbatim (const char *msgid, ...)
+verbatim (const char *gmsgid, ...)
{
text_info text;
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
text.err_no = errno;
text.args_ptr = ≈
- text.format_spec = _(msgid);
+ text.format_spec = _(gmsgid);
+ text.locus = NULL;
pp_format_verbatim (global_dc->printer, &text);
pp_flush (global_dc->printer);
va_end (ap);
/* An informative note. Use this for additional details on an error
message. */
void
-inform (const char *msgid, ...)
+inform (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_NOTE);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_NOTE);
report_diagnostic (&diagnostic);
va_end (ap);
}
/* A warning. Use this for code which is correct according to the
relevant language specification but is likely to be buggy anyway. */
void
-warning (const char *msgid, ...)
+warning (int opt, const char *gmsgid, ...)
+{
+ diagnostic_info diagnostic;
+ va_list ap;
+
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
+ diagnostic.option_index = opt;
+
+ report_diagnostic (&diagnostic);
+ va_end (ap);
+}
+
+void
+warning0 (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_WARNING);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
report_diagnostic (&diagnostic);
va_end (ap);
}
of the -pedantic command-line switch. To get a warning enabled
only with that switch, write "if (pedantic) pedwarn (...);" */
void
-pedwarn (const char *msgid, ...)
+pedwarn (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location,
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location,
pedantic_error_kind ());
report_diagnostic (&diagnostic);
va_end (ap);
/* A hard error: the code is definitely ill-formed, and an object file
will not be produced. */
void
-error (const char *msgid, ...)
+error (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_ERROR);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ERROR);
report_diagnostic (&diagnostic);
va_end (ap);
}
required by the relevant specification but not implemented by GCC.
An object file will not be produced. */
void
-sorry (const char *msgid, ...)
+sorry (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_SORRY);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_SORRY);
report_diagnostic (&diagnostic);
va_end (ap);
}
continue. Do not use this for internal consistency checks; that's
internal_error. Use of this function should be rare. */
void
-fatal_error (const char *msgid, ...)
+fatal_error (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_FATAL);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_FATAL);
report_diagnostic (&diagnostic);
va_end (ap);
a more specific message, or some other good reason, you should use
abort () instead of calling this function directly. */
void
-internal_error (const char *msgid, ...)
+internal_error (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_ICE);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE);
report_diagnostic (&diagnostic);
va_end (ap);
/* Print a diagnostic MSGID on FILE. This is just fprintf, except it
runs its second argument through gettext. */
void
-fnotice (FILE *file, const char *msgid, ...)
+fnotice (FILE *file, const char *cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- vfprintf (file, _(msgid), ap);
+ va_start (ap, cmsgid);
+ vfprintf (file, _(cmsgid), ap);
va_end (ap);
}