re PR fortran/44054 (Handle -Werror, -Werror=, -fdiagnostics-show-option, !GCC$ diagnostic (pragmas) and color)

gcc/ChangeLog:

2014-08-21  Manuel López-Ibáñez  <manu@gcc.gnu.org>

	PR fortran/44054
	* diagnostic.c: Set default caret.
	(diagnostic_show_locus): Use it. Tell pretty-printer that a new
	line is needed.
	* diagnostic.h (struct diagnostic_context):


gcc/fortran/ChangeLog:

2014-08-21  Manuel López-Ibáñez  <manu@gcc.gnu.org>

	PR fortran/44054
	* error.c (gfc_diagnostic_build_locus_prefix): New function.
	(gfc_diagnostic_starter): Follow Fortran FE diagnostics.
	(gfc_diagnostic_finalizer): Do not call default finalizer.

From-SVN: r214251
This commit is contained in:
Manuel López-Ibáñez 2014-08-21 00:27:25 +00:00
parent ecda22b23d
commit fbecdc8382
5 changed files with 67 additions and 15 deletions

View File

@ -1,3 +1,11 @@
2014-08-21 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR fortran/44054
* diagnostic.c: Set default caret.
(diagnostic_show_locus): Use it. Tell pretty-printer that a new
line is needed.
* diagnostic.h (struct diagnostic_context):
2014-08-21 David Malcolm <dmalcolm@redhat.com> 2014-08-21 David Malcolm <dmalcolm@redhat.com>
* sel-sched-ir.h (exit_insn): Strengthen from rtx to rtx_insn *. * sel-sched-ir.h (exit_insn): Strengthen from rtx to rtx_insn *.

View File

@ -131,6 +131,7 @@ diagnostic_initialize (diagnostic_context *context, int n_opts)
context->classify_diagnostic[i] = DK_UNSPECIFIED; context->classify_diagnostic[i] = DK_UNSPECIFIED;
context->show_caret = false; context->show_caret = false;
diagnostic_set_caret_max_width (context, pp_line_cutoff (context->printer)); diagnostic_set_caret_max_width (context, pp_line_cutoff (context->printer));
context->caret_char = '^';
context->show_option_requested = false; context->show_option_requested = false;
context->abort_on_error = false; context->abort_on_error = false;
context->show_column = false; context->show_column = false;
@ -280,7 +281,7 @@ adjust_line (const char *line, int line_width,
} }
/* Print the physical source line corresponding to the location of /* Print the physical source line corresponding to the location of
this diagnostics, and a caret indicating the precise column. */ this diagnostic, and a caret indicating the precise column. */
void void
diagnostic_show_locus (diagnostic_context * context, diagnostic_show_locus (diagnostic_context * context,
const diagnostic_info *diagnostic) const diagnostic_info *diagnostic)
@ -328,9 +329,11 @@ diagnostic_show_locus (diagnostic_context * context,
/* pp_printf does not implement %*c. */ /* pp_printf does not implement %*c. */
size_t len = s.column + 3 + strlen (caret_cs) + strlen (caret_ce); size_t len = s.column + 3 + strlen (caret_cs) + strlen (caret_ce);
buffer = XALLOCAVEC (char, len); buffer = XALLOCAVEC (char, len);
snprintf (buffer, len, "%s %*c%s", caret_cs, s.column, '^', caret_ce); snprintf (buffer, len, "%s %*c%s", caret_cs, s.column, context->caret_char,
caret_ce);
pp_string (context->printer, buffer); pp_string (context->printer, buffer);
pp_set_prefix (context->printer, saved_prefix); pp_set_prefix (context->printer, saved_prefix);
pp_needs_newline (context->printer) = true;
} }
/* Functions at which to stop the backtrace print. It's not /* Functions at which to stop the backtrace print. It's not

View File

@ -105,6 +105,9 @@ struct diagnostic_context
/* Maximum width of the source line printed. */ /* Maximum width of the source line printed. */
int caret_max_width; int caret_max_width;
/* Character used for caret diagnostics. */
char caret_char;
/* True if we should print the command line option which controls /* True if we should print the command line option which controls
each diagnostic, if known. */ each diagnostic, if known. */
bool show_option_requested; bool show_option_requested;

View File

@ -1,3 +1,10 @@
2014-08-21 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR fortran/44054
* error.c (gfc_diagnostic_build_locus_prefix): New function.
(gfc_diagnostic_starter): Follow Fortran FE diagnostics.
(gfc_diagnostic_finalizer): Do not call default finalizer.
2014-08-21 Manuel López-Ibáñez <manu@gcc.gnu.org> 2014-08-21 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR fortran/44054 PR fortran/44054

View File

@ -987,39 +987,69 @@ gfc_diagnostic_build_prefix (diagnostic_context *context,
diagnostic_kind_color[diagnostic->kind]); diagnostic_kind_color[diagnostic->kind]);
text_ce = colorize_stop (pp_show_color (pp)); text_ce = colorize_stop (pp_show_color (pp));
} }
return build_message_string ("%s%s%s: ", text_cs, text, text_ce);
}
/* Return a malloc'd string describing a location. The caller is
responsible for freeing the memory. */
static char *
gfc_diagnostic_build_locus_prefix (diagnostic_context *context,
const diagnostic_info *diagnostic)
{
pretty_printer *pp = context->printer;
const char *locus_cs = colorize_start (pp_show_color (pp), "locus"); const char *locus_cs = colorize_start (pp_show_color (pp), "locus");
const char *locus_ce = colorize_stop (pp_show_color (pp)); const char *locus_ce = colorize_stop (pp_show_color (pp));
expanded_location s = expand_location_to_spelling_point (diagnostic->location); expanded_location s = expand_location_to_spelling_point (diagnostic->location);
if (diagnostic->override_column) if (diagnostic->override_column)
s.column = diagnostic->override_column; s.column = diagnostic->override_column;
return (s.file == NULL return (s.file == NULL
? build_message_string ("%s%s:%s %s%s%s: ", locus_cs, progname, locus_ce, ? build_message_string ("%s%s:%s ", locus_cs, progname, locus_ce )
text_cs, text, text_ce)
: !strcmp (s.file, N_("<built-in>")) : !strcmp (s.file, N_("<built-in>"))
? build_message_string ("%s%s:%s %s%s%s: ", locus_cs, s.file, locus_ce, ? build_message_string ("%s%s:%s ", locus_cs, s.file, locus_ce)
text_cs, text, text_ce)
: context->show_column : context->show_column
? build_message_string ("%s%s:%d:%d:%s %s%s%s: ", locus_cs, s.file, s.line, ? build_message_string ("%s%s:%d:%d:%s ", locus_cs, s.file, s.line,
s.column, locus_ce, text_cs, text, text_ce) s.column, locus_ce)
: build_message_string ("%s%s:%d:%s %s%s%s: ", locus_cs, s.file, s.line, locus_ce, : build_message_string ("%s%s:%d:%s ", locus_cs, s.file, s.line, locus_ce));
text_cs, text, text_ce));
} }
static void static void
gfc_diagnostic_starter (diagnostic_context *context, gfc_diagnostic_starter (diagnostic_context *context,
diagnostic_info *diagnostic) diagnostic_info *diagnostic)
{ {
pp_set_prefix (context->printer, gfc_diagnostic_build_prefix (context, char * locus_prefix = gfc_diagnostic_build_locus_prefix (context, diagnostic);
diagnostic)); char * prefix = gfc_diagnostic_build_prefix (context, diagnostic);
/* First we assume there is a caret line. */
pp_set_prefix (context->printer, NULL);
if (pp_needs_newline (context->printer))
pp_newline (context->printer);
pp_verbatim (context->printer, locus_prefix);
/* Fortran uses an empty line between locus and caret line. */
pp_newline (context->printer);
diagnostic_show_locus (context, diagnostic);
if (pp_needs_newline (context->printer))
{
pp_newline (context->printer);
/* If the caret line was shown, the prefix does not contain the
locus. */
pp_set_prefix (context->printer, prefix);
}
else
{
/* Otherwise, start again. */
pp_clear_output_area(context->printer);
pp_set_prefix (context->printer, concat (locus_prefix, prefix, NULL));
free (prefix);
}
free (locus_prefix);
} }
static void static void
gfc_diagnostic_finalizer (diagnostic_context *context, gfc_diagnostic_finalizer (diagnostic_context *context,
diagnostic_info *diagnostic) diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
{ {
default_diagnostic_finalizer(context, diagnostic); pp_destroy_prefix (context->printer);
pp_newline_and_flush (context->printer);
} }
/* Give a warning about the command-line. */ /* Give a warning about the command-line. */
@ -1291,4 +1321,5 @@ gfc_diagnostics_init (void)
{ {
diagnostic_starter (global_dc) = gfc_diagnostic_starter; diagnostic_starter (global_dc) = gfc_diagnostic_starter;
diagnostic_finalizer (global_dc) = gfc_diagnostic_finalizer; diagnostic_finalizer (global_dc) = gfc_diagnostic_finalizer;
global_dc->caret_char = '^';
} }