summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>2014-08-21 00:27:25 +0000
committermanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>2014-08-21 00:27:25 +0000
commitd19fa5627239c551ca72e23824d747c81be27589 (patch)
tree8e4a6ff9aef324beb077e82626a2a4e8f6c910e9
parente43ee83e92cdd47e03982cdf0056b184de35b366 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/diagnostic.c7
-rw-r--r--gcc/diagnostic.h3
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/error.c57
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 = '^';
}