diff options
author | manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-21 00:27:25 +0000 |
---|---|---|
committer | manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-21 00:27:25 +0000 |
commit | d19fa5627239c551ca72e23824d747c81be27589 (patch) | |
tree | 8e4a6ff9aef324beb077e82626a2a4e8f6c910e9 | |
parent | e43ee83e92cdd47e03982cdf0056b184de35b366 (diff) | |
download | gcc-d19fa5627239c551ca72e23824d747c81be27589.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@214251 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/diagnostic.c | 7 | ||||
-rw-r--r-- | gcc/diagnostic.h | 3 | ||||
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/error.c | 57 |
5 files changed, 67 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ccef56806d7..1067203024d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 *. diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index 9e6bfe52bff..73666d62fc7 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -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 diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 0d69de5aedc..64f90a79324 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -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; diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d47bffc2a7f..91330ffdd5f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,6 +1,13 @@ 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 * error.c (gfc_diagnostic_finalizer): Call default finalizer. 2014-08-20 Joost VandeVondele <Joost.VandeVondele@mat.ethz.ch> diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c index 7aab46d4311..a08aa9bd72e 100644 --- a/gcc/fortran/error.c +++ b/gcc/fortran/error.c @@ -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 = '^'; } |