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:
parent
ecda22b23d
commit
fbecdc8382
5 changed files with 67 additions and 15 deletions
|
@ -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 *.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = '^';
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue