mirror of git://gcc.gnu.org/git/gcc.git
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
|
|
@ -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 *.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 = '^';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue