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>
* 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->show_caret = false;
diagnostic_set_caret_max_width (context, pp_line_cutoff (context->printer));
context->caret_char = '^';
context->show_option_requested = false;
context->abort_on_error = 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
this diagnostics, and a caret indicating the precise column. */
this diagnostic, and a caret indicating the precise column. */
void
diagnostic_show_locus (diagnostic_context * context,
const diagnostic_info *diagnostic)
@ -328,9 +329,11 @@ diagnostic_show_locus (diagnostic_context * context,
/* pp_printf does not implement %*c. */
size_t len = s.column + 3 + strlen (caret_cs) + strlen (caret_ce);
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_set_prefix (context->printer, saved_prefix);
pp_needs_newline (context->printer) = true;
}
/* 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. */
int caret_max_width;
/* Character used for caret diagnostics. */
char caret_char;
/* True if we should print the command line option which controls
each diagnostic, if known. */
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>
PR fortran/44054

View File

@ -987,39 +987,69 @@ gfc_diagnostic_build_prefix (diagnostic_context *context,
diagnostic_kind_color[diagnostic->kind]);
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_ce = colorize_stop (pp_show_color (pp));
expanded_location s = expand_location_to_spelling_point (diagnostic->location);
if (diagnostic->override_column)
s.column = diagnostic->override_column;
return (s.file == NULL
? build_message_string ("%s%s:%s %s%s%s: ", locus_cs, progname, locus_ce,
text_cs, text, text_ce)
? build_message_string ("%s%s:%s ", locus_cs, progname, locus_ce )
: !strcmp (s.file, N_("<built-in>"))
? build_message_string ("%s%s:%s %s%s%s: ", locus_cs, s.file, locus_ce,
text_cs, text, text_ce)
? build_message_string ("%s%s:%s ", locus_cs, s.file, locus_ce)
: context->show_column
? build_message_string ("%s%s:%d:%d:%s %s%s%s: ", locus_cs, s.file, s.line,
s.column, locus_ce, text_cs, text, text_ce)
: build_message_string ("%s%s:%d:%s %s%s%s: ", locus_cs, s.file, s.line, locus_ce,
text_cs, text, text_ce));
? build_message_string ("%s%s:%d:%d:%s ", locus_cs, s.file, s.line,
s.column, locus_ce)
: build_message_string ("%s%s:%d:%s ", locus_cs, s.file, s.line, locus_ce));
}
static void
gfc_diagnostic_starter (diagnostic_context *context,
diagnostic_info *diagnostic)
{
pp_set_prefix (context->printer, gfc_diagnostic_build_prefix (context,
diagnostic));
char * locus_prefix = gfc_diagnostic_build_locus_prefix (context, 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
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. */
@ -1291,4 +1321,5 @@ gfc_diagnostics_init (void)
{
diagnostic_starter (global_dc) = gfc_diagnostic_starter;
diagnostic_finalizer (global_dc) = gfc_diagnostic_finalizer;
global_dc->caret_char = '^';
}