@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see
#include "dumpfile.h"
#include "file-prefix-map.h" /* add_*_prefix_map() */
#include "context.h"
+#include "diagnostic-format-text.h"
#ifndef DOLLARS_IN_IDENTIFIERS
# define DOLLARS_IN_IDENTIFIERS true
@@ -168,18 +169,19 @@ c_common_option_lang_mask (void)
/* Diagnostic finalizer for C/C++/Objective-C/Objective-C++. */
static void
-c_diagnostic_finalizer (diagnostic_context *context,
- const diagnostic_info *diagnostic,
- diagnostic_t)
+c_diagnostic_text_finalizer (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic,
+ diagnostic_t)
{
- pretty_printer *const pp = context->m_printer;
+ pretty_printer *const pp = text_output.get_printer ();
char *saved_prefix = pp_take_prefix (pp);
pp_set_prefix (pp, NULL);
pp_newline (pp);
- diagnostic_show_locus (context, diagnostic->richloc, diagnostic->kind, pp);
+ diagnostic_show_locus (&text_output.get_context (),
+ diagnostic->richloc, diagnostic->kind, pp);
/* By default print macro expansion contexts in the diagnostic
finalizer -- for tokens resulting from macro expansion. */
- virt_loc_aware_diagnostic_finalizer (context, diagnostic);
+ virt_loc_aware_diagnostic_finalizer (text_output, diagnostic);
pp_set_prefix (pp, saved_prefix);
pp_flush (pp);
}
@@ -188,7 +190,7 @@ c_diagnostic_finalizer (diagnostic_context *context,
void
c_common_diagnostics_set_defaults (diagnostic_context *context)
{
- diagnostic_finalizer (context) = c_diagnostic_finalizer;
+ diagnostic_text_finalizer (context) = c_diagnostic_text_finalizer;
context->m_opt_permissive = OPT_fpermissive;
}
@@ -159,6 +159,7 @@ struct cl_decoded_option;
struct cl_option_handlers;
class rich_location;
class diagnostic_context;
+class diagnostic_text_output_format;
class pretty_printer;
class diagnostic_event_id_t;
typedef const char * (*diagnostic_input_charset_callback)(const char *);
@@ -8170,7 +8170,7 @@ extern void cxx_print_xnode (FILE *, tree, int);
extern void cxx_print_decl (FILE *, tree, int);
extern void cxx_print_type (FILE *, tree, int);
extern void cxx_print_identifier (FILE *, tree, int);
-extern void cxx_print_error_function (diagnostic_context *,
+extern void cxx_print_error_function (diagnostic_text_output_format &,
const char *,
const diagnostic_info *);
@@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see
#include "attribs.h"
#include "pretty-print-format-impl.h"
#include "make-unique.h"
+#include "diagnostic-format-text.h"
#define pp_separate_with_comma(PP) pp_cxx_separate_with (PP, ',')
#define pp_separate_with_semicolon(PP) pp_cxx_separate_with (PP, ';')
@@ -98,16 +99,16 @@ static void dump_scope (cxx_pretty_printer *, tree, int);
static void dump_template_parms (cxx_pretty_printer *, tree, int, int);
static int get_non_default_template_args_count (tree, int);
static const char *function_category (tree);
-static void maybe_print_constexpr_context (diagnostic_context *);
-static void maybe_print_instantiation_context (diagnostic_context *);
-static void print_instantiation_full_context (diagnostic_context *);
-static void print_instantiation_partial_context (diagnostic_context *,
+static void maybe_print_constexpr_context (diagnostic_text_output_format &);
+static void maybe_print_instantiation_context (diagnostic_text_output_format &);
+static void print_instantiation_full_context (diagnostic_text_output_format &);
+static void print_instantiation_partial_context (diagnostic_text_output_format &,
struct tinst_level *,
location_t);
-static void maybe_print_constraint_context (diagnostic_context *);
-static void cp_diagnostic_starter (diagnostic_context *,
- const diagnostic_info *);
-static void cp_print_error_function (diagnostic_context *,
+static void maybe_print_constraint_context (diagnostic_text_output_format &);
+static void cp_diagnostic_text_starter (diagnostic_text_output_format &,
+ const diagnostic_info *);
+static void cp_print_error_function (diagnostic_text_output_format &,
const diagnostic_info *);
static bool cp_printer (pretty_printer *, text_info *, const char *,
@@ -284,8 +285,8 @@ cxx_initialize_diagnostics (diagnostic_context *context)
XDELETE (base);
c_common_diagnostics_set_defaults (context);
- diagnostic_starter (context) = cp_diagnostic_starter;
- /* diagnostic_finalizer is already c_diagnostic_finalizer. */
+ diagnostic_text_starter (context) = cp_diagnostic_text_starter;
+ /* diagnostic_finalizer is already c_diagnostic_text_finalizer. */
diagnostic_format_decoder (context) = cp_printer;
context->m_adjust_diagnostic_info = cp_adjust_diagnostic_info;
pp_format_postprocessor (pp) = new cxx_format_postprocessor ();
@@ -3665,7 +3666,8 @@ eh_spec_to_string (tree p, int /*v*/)
/* Langhook for print_error_function. */
void
-cxx_print_error_function (diagnostic_context *context, const char *file,
+cxx_print_error_function (diagnostic_text_output_format &text_output,
+ const char *file,
const diagnostic_info *diagnostic)
{
char *prefix;
@@ -3673,28 +3675,29 @@ cxx_print_error_function (diagnostic_context *context, const char *file,
prefix = xstrdup (file);
else
prefix = NULL;
- lhd_print_error_function (context, file, diagnostic);
- pp_set_prefix (context->m_printer, prefix);
- maybe_print_instantiation_context (context);
+ lhd_print_error_function (text_output, file, diagnostic);
+
+ pp_set_prefix (text_output.get_printer (), prefix);
+ maybe_print_instantiation_context (text_output);
}
static void
-cp_diagnostic_starter (diagnostic_context *context,
- const diagnostic_info *diagnostic)
+cp_diagnostic_text_starter (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic)
{
- diagnostic_report_current_module (context, diagnostic_location (diagnostic));
- cp_print_error_function (context, diagnostic);
- maybe_print_instantiation_context (context);
- maybe_print_constexpr_context (context);
- maybe_print_constraint_context (context);
- pp_set_prefix (context->m_printer, diagnostic_build_prefix (context,
- diagnostic));
+ text_output.report_current_module (diagnostic_location (diagnostic));
+ cp_print_error_function (text_output, diagnostic);
+ maybe_print_instantiation_context (text_output);
+ maybe_print_constexpr_context (text_output);
+ maybe_print_constraint_context (text_output);
+ pp_set_prefix (text_output.get_printer (),
+ text_output.build_prefix (*diagnostic));
}
/* Print current function onto BUFFER, in the process of reporting
a diagnostic message. Called from cp_diagnostic_starter. */
static void
-cp_print_error_function (diagnostic_context *context,
+cp_print_error_function (diagnostic_text_output_format &text_output,
const diagnostic_info *diagnostic)
{
/* If we are in an instantiation context, current_function_decl is likely
@@ -3704,14 +3707,15 @@ cp_print_error_function (diagnostic_context *context,
/* The above is true for constraint satisfaction also. */
if (current_failed_constraint)
return;
+ diagnostic_context *const context = &text_output.get_context ();
if (diagnostic_last_function_changed (context, diagnostic))
{
- pretty_printer *const pp = context->m_printer;
+ pretty_printer *const pp = text_output.get_printer ();
char *old_prefix = pp_take_prefix (pp);
const char *file = LOCATION_FILE (diagnostic_location (diagnostic));
tree abstract_origin = diagnostic_abstract_origin (diagnostic);
char *new_prefix = (file && abstract_origin == NULL)
- ? file_name_as_prefix (context, file) : NULL;
+ ? text_output.file_name_as_prefix (file) : NULL;
pp_set_prefix (pp, new_prefix);
@@ -3773,7 +3777,7 @@ cp_print_error_function (diagnostic_context *context,
pp_newline (pp);
if (s.file != NULL)
{
- if (context->m_show_column && s.column != 0)
+ if (text_output.show_column_p () && s.column != 0)
pp_printf (pp,
_(" inlined from %qD at %r%s:%d:%d%R"),
fndecl,
@@ -3841,14 +3845,14 @@ function_category (tree fn)
/* Report the full context of a current template instantiation,
onto BUFFER. */
static void
-print_instantiation_full_context (diagnostic_context *context)
+print_instantiation_full_context (diagnostic_text_output_format &text_output)
{
struct tinst_level *p = current_instantiation ();
location_t location = input_location;
if (p)
{
- pp_verbatim (context->m_printer,
+ pp_verbatim (text_output.get_printer (),
p->list_p ()
? _("%s: In substitution of %qS:\n")
: _("%s: In instantiation of %q#D:\n"),
@@ -3859,14 +3863,14 @@ print_instantiation_full_context (diagnostic_context *context)
p = p->next;
}
- print_instantiation_partial_context (context, p, location);
+ print_instantiation_partial_context (text_output, p, location);
}
/* Helper function of print_instantiation_partial_context() that
prints a single line of instantiation context. */
static void
-print_instantiation_partial_context_line (diagnostic_context *context,
+print_instantiation_partial_context_line (diagnostic_text_output_format &text_output,
struct tinst_level *t,
location_t loc, bool recursive_p)
{
@@ -3875,9 +3879,9 @@ print_instantiation_partial_context_line (diagnostic_context *context,
expanded_location xloc = expand_location (loc);
- pretty_printer *const pp = context->m_printer;
+ pretty_printer *const pp = text_output.get_printer ();
- if (context->m_show_column)
+ if (text_output.show_column_p ())
pp_verbatim (pp, _("%r%s:%d:%d:%R "),
"locus", xloc.file, xloc.line, xloc.column);
else
@@ -3908,14 +3912,14 @@ print_instantiation_partial_context_line (diagnostic_context *context,
}
gcc_rich_location rich_loc (loc);
char *saved_prefix = pp_take_prefix (pp);
- diagnostic_show_locus (context, &rich_loc, DK_NOTE);
+ diagnostic_show_locus (&text_output.get_context (), &rich_loc, DK_NOTE, pp);
pp_set_prefix (pp, saved_prefix);
}
/* Same as print_instantiation_full_context but less verbose. */
static void
-print_instantiation_partial_context (diagnostic_context *context,
+print_instantiation_partial_context (diagnostic_text_output_format &text_output,
struct tinst_level *t0, location_t loc)
{
struct tinst_level *t;
@@ -3949,7 +3953,7 @@ print_instantiation_partial_context (diagnostic_context *context,
{
gcc_assert (t != NULL);
if (loc != t->locus)
- print_instantiation_partial_context_line (context, t, loc,
+ print_instantiation_partial_context_line (text_output, t, loc,
/*recursive_p=*/false);
loc = t->locus;
t = t->next;
@@ -3958,8 +3962,8 @@ print_instantiation_partial_context (diagnostic_context *context,
{
expanded_location xloc;
xloc = expand_location (loc);
- pretty_printer *const pp = context->m_printer;
- if (context->m_show_column)
+ pretty_printer *const pp = text_output.get_printer ();
+ if (text_output.show_column_p ())
pp_verbatim (pp,
_("%r%s:%d:%d:%R [ skipping %d instantiation "
"contexts, use -ftemplate-backtrace-limit=0 to "
@@ -3986,30 +3990,30 @@ print_instantiation_partial_context (diagnostic_context *context,
loc = t->locus;
t = t->next;
}
- print_instantiation_partial_context_line (context, t, loc,
+ print_instantiation_partial_context_line (text_output, t, loc,
t->locus == loc);
loc = t->locus;
t = t->next;
}
- print_instantiation_partial_context_line (context, NULL, loc,
+ print_instantiation_partial_context_line (text_output, NULL, loc,
/*recursive_p=*/false);
}
/* Called from cp_thing to print the template context for an error. */
static void
-maybe_print_instantiation_context (diagnostic_context *context)
+maybe_print_instantiation_context (diagnostic_text_output_format &text_output)
{
if (!problematic_instantiation_changed () || current_instantiation () == 0)
return;
record_last_problematic_instantiation ();
- print_instantiation_full_context (context);
+ print_instantiation_full_context (text_output);
}
/* Report what constexpr call(s) we're trying to expand, if any. */
void
-maybe_print_constexpr_context (diagnostic_context *context)
+maybe_print_constexpr_context (diagnostic_text_output_format &text_output)
{
vec<tree> call_stack = cx_error_context ();
unsigned ix;
@@ -4019,8 +4023,8 @@ maybe_print_constexpr_context (diagnostic_context *context)
{
expanded_location xloc = expand_location (EXPR_LOCATION (t));
const char *s = expr_as_string (t, 0);
- pretty_printer *const pp = context->m_printer;
- if (context->m_show_column)
+ pretty_printer *const pp = text_output.get_printer ();
+ if (text_output.show_column_p ())
pp_verbatim (pp,
_("%r%s:%d:%d:%R in %<constexpr%> expansion of %qs"),
"locus", xloc.file, xloc.line, xloc.column, s);
@@ -4034,11 +4038,12 @@ maybe_print_constexpr_context (diagnostic_context *context)
static void
-print_location (diagnostic_context *context, location_t loc)
+print_location (diagnostic_text_output_format &text_output,
+ location_t loc)
{
expanded_location xloc = expand_location (loc);
- pretty_printer *const pp = context->m_printer;
- if (context->m_show_column)
+ pretty_printer *const pp = text_output.get_printer ();
+ if (text_output.show_column_p ())
pp_verbatim (pp, _("%r%s:%d:%d:%R "),
"locus", xloc.file, xloc.line, xloc.column);
else
@@ -4047,23 +4052,26 @@ print_location (diagnostic_context *context, location_t loc)
}
static void
-print_constrained_decl_info (diagnostic_context *context, tree decl)
+print_constrained_decl_info (diagnostic_text_output_format &text_output,
+ tree decl)
{
- print_location (context, DECL_SOURCE_LOCATION (decl));
- pretty_printer *const pp = context->m_printer;
+ print_location (text_output, DECL_SOURCE_LOCATION (decl));
+ pretty_printer *const pp = text_output.get_printer ();
pp_verbatim (pp, "required by the constraints of %q#D\n", decl);
}
static void
-print_concept_check_info (diagnostic_context *context, tree expr, tree map, tree args)
+print_concept_check_info (diagnostic_text_output_format &text_output,
+ tree expr, tree map, tree args)
{
gcc_assert (concept_check_p (expr));
tree tmpl = TREE_OPERAND (expr, 0);
- print_location (context, DECL_SOURCE_LOCATION (tmpl));
+ print_location (text_output, DECL_SOURCE_LOCATION (tmpl));
- cxx_pretty_printer *const pp = (cxx_pretty_printer *)context->m_printer;
+ cxx_pretty_printer *const pp
+ = (cxx_pretty_printer *)text_output.get_printer ();
pp_verbatim (pp, "required for the satisfaction of %qE", expr);
if (map && map != error_mark_node)
{
@@ -4078,30 +4086,32 @@ print_concept_check_info (diagnostic_context *context, tree expr, tree map, tree
context, if any. */
static tree
-print_constraint_context_head (diagnostic_context *context, tree cxt, tree args)
+print_constraint_context_head (diagnostic_text_output_format &text_output,
+ tree cxt, tree args)
{
tree src = TREE_VALUE (cxt);
if (!src)
{
- print_location (context, input_location);
- pretty_printer *const pp = context->m_printer;
+ print_location (text_output, input_location);
+ pretty_printer *const pp = text_output.get_printer ();
pp_verbatim (pp, "required for constraint satisfaction\n");
return NULL_TREE;
}
if (DECL_P (src))
{
- print_constrained_decl_info (context, src);
+ print_constrained_decl_info (text_output, src);
return NULL_TREE;
}
else
{
- print_concept_check_info (context, src, TREE_PURPOSE (cxt), args);
+ print_concept_check_info (text_output, src, TREE_PURPOSE (cxt), args);
return TREE_CHAIN (cxt);
}
}
static void
-print_requires_expression_info (diagnostic_context *context, tree constr, tree args)
+print_requires_expression_info (diagnostic_text_output_format &text_output,
+ tree constr, tree args)
{
tree expr = ATOMIC_CONSTR_EXPR (constr);
@@ -4110,9 +4120,9 @@ print_requires_expression_info (diagnostic_context *context, tree constr, tree a
if (map == error_mark_node)
return;
- print_location (context, cp_expr_loc_or_input_loc (expr));
+ print_location (text_output, cp_expr_loc_or_input_loc (expr));
cxx_pretty_printer *const pp
- = static_cast <cxx_pretty_printer *> (context->m_printer);
+ = static_cast <cxx_pretty_printer *> (text_output.get_printer ());
pp_verbatim (pp, "in requirements ");
tree parms = TREE_OPERAND (expr, 0);
@@ -4131,7 +4141,8 @@ print_requires_expression_info (diagnostic_context *context, tree constr, tree a
}
void
-maybe_print_single_constraint_context (diagnostic_context *context, tree failed)
+maybe_print_single_constraint_context (diagnostic_text_output_format &text_output,
+ tree failed)
{
if (!failed)
return;
@@ -4145,23 +4156,23 @@ maybe_print_single_constraint_context (diagnostic_context *context, tree failed)
tree args = TREE_PURPOSE (failed);
/* Print the stack of requirements. */
- cxt = print_constraint_context_head (context, cxt, args);
+ cxt = print_constraint_context_head (text_output, cxt, args);
while (cxt && !DECL_P (TREE_VALUE (cxt)))
{
tree expr = TREE_VALUE (cxt);
tree map = TREE_PURPOSE (cxt);
- print_concept_check_info (context, expr, map, args);
+ print_concept_check_info (text_output, expr, map, args);
cxt = TREE_CHAIN (cxt);
}
/* For certain constraints, we can provide additional context. */
if (TREE_CODE (constr) == ATOMIC_CONSTR
&& TREE_CODE (ATOMIC_CONSTR_EXPR (constr)) == REQUIRES_EXPR)
- print_requires_expression_info (context, constr, args);
+ print_requires_expression_info (text_output, constr, args);
}
void
-maybe_print_constraint_context (diagnostic_context *context)
+maybe_print_constraint_context (diagnostic_text_output_format &text_output)
{
if (!current_failed_constraint)
return;
@@ -4171,10 +4182,10 @@ maybe_print_constraint_context (diagnostic_context *context)
/* Recursively print nested contexts. */
current_failed_constraint = TREE_CHAIN (current_failed_constraint);
if (current_failed_constraint)
- maybe_print_constraint_context (context);
+ maybe_print_constraint_context (text_output);
/* Print this context. */
- maybe_print_single_constraint_context (context, cur);
+ maybe_print_single_constraint_context (text_output, cur);
}
/* Return true iff TYPE_A and TYPE_B are template types that are
@@ -54,6 +54,10 @@ public:
{
/* No-op. */
}
+ void after_diagnostic (const diagnostic_info &) final override
+ {
+ /* No-op. */
+ }
protected:
json_output_format (diagnostic_context &context,
@@ -3139,6 +3139,10 @@ public:
{
m_builder.emit_diagram (m_context, diagram);
}
+ void after_diagnostic (const diagnostic_info &) final override
+ {
+ /* No-op. */
+ }
sarif_builder &get_builder () { return m_builder; }
@@ -34,6 +34,13 @@ along with GCC; see the file COPYING3. If not see
#include "diagnostic-format-text.h"
#include "text-art/theme.h"
+/* Disable warnings about quoting issues in the pp_xxx calls below
+ that (intentionally) don't follow GCC diagnostic conventions. */
+#if __GNUC__ >= 10
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wformat-diag"
+#endif
+
/* class diagnostic_text_output_format : public diagnostic_output_format. */
diagnostic_text_output_format::~diagnostic_text_output_format ()
@@ -41,7 +48,7 @@ diagnostic_text_output_format::~diagnostic_text_output_format ()
/* Some of the errors may actually have been warnings. */
if (m_context.diagnostic_count (DK_WERROR))
{
- pretty_printer *pp = m_context.m_printer;
+ pretty_printer *pp = get_printer ();
/* -Werror was given. */
if (m_context.warning_as_error_requested_p ())
pp_verbatim (pp,
@@ -54,6 +61,12 @@ diagnostic_text_output_format::~diagnostic_text_output_format ()
progname);
pp_newline_and_flush (pp);
}
+
+ if (m_includes_seen)
+ {
+ delete m_includes_seen;
+ m_includes_seen = nullptr;
+ }
}
/* Implementation of diagnostic_output_format::on_report_diagnostic vfunc
@@ -64,9 +77,9 @@ diagnostic_text_output_format::
on_report_diagnostic (const diagnostic_info &diagnostic,
diagnostic_t orig_diag_kind)
{
- pretty_printer *pp = m_context.m_printer;
+ pretty_printer *pp = get_printer ();
- (*diagnostic_starter (&m_context)) (&m_context, &diagnostic);
+ (*diagnostic_text_starter (&m_context)) (*this, &diagnostic);
pp_output_formatted_text (pp, m_context.get_urlifier ());
@@ -79,9 +92,9 @@ on_report_diagnostic (const diagnostic_info &diagnostic,
if (m_context.m_show_option_requested)
print_option_information (diagnostic, orig_diag_kind);
- (*diagnostic_finalizer (&m_context)) (&m_context,
- &diagnostic,
- orig_diag_kind);
+ (*diagnostic_text_finalizer (&m_context)) (*this,
+ &diagnostic,
+ orig_diag_kind);
}
void
@@ -100,6 +113,13 @@ diagnostic_text_output_format::on_diagram (const diagnostic_diagram &diagram)
pp_flush (pp);
}
+void
+diagnostic_text_output_format::
+after_diagnostic (const diagnostic_info &diagnostic)
+{
+ show_any_path (diagnostic);
+}
+
/* If DIAGNOSTIC has a CWE identifier, print it.
For example, if the diagnostic metadata associates it with CWE-119,
@@ -213,3 +233,157 @@ print_option_information (const diagnostic_info &diagnostic,
free (option_text);
}
}
+
+/* Only dump the "In file included from..." stack once for each file. */
+
+bool
+diagnostic_text_output_format::includes_seen_p (const line_map_ordinary *map)
+{
+ /* No include path for main. */
+ if (MAIN_FILE_P (map))
+ return true;
+
+ /* Always identify C++ modules, at least for now. */
+ auto probe = map;
+ if (linemap_check_ordinary (map)->reason == LC_RENAME)
+ /* The module source file shows up as LC_RENAME inside LC_MODULE. */
+ probe = linemap_included_from_linemap (line_table, map);
+ if (MAP_MODULE_P (probe))
+ return false;
+
+ if (!m_includes_seen)
+ m_includes_seen = new hash_set<location_t, false, location_hash>;
+
+ /* Hash the location of the #include directive to better handle files
+ that are included multiple times with different macros defined. */
+ return m_includes_seen->add (linemap_included_from (map));
+}
+
+label_text
+diagnostic_text_output_format::
+get_location_text (const expanded_location &s) const
+{
+ return get_context ().get_location_text (s, pp_show_color (get_printer ()));
+}
+
+
+/* Helpers for writing lang-specific starters/finalizers for text output. */
+
+/* Return a formatted line and column ':%line:%column'. Elided if
+ line == 0 or col < 0. (A column of 0 may be valid due to the
+ -fdiagnostics-column-origin option.)
+ The result is a statically allocated buffer. */
+
+const char *
+maybe_line_and_column (int line, int col)
+{
+ static char result[32];
+
+ if (line)
+ {
+ size_t l
+ = snprintf (result, sizeof (result),
+ col >= 0 ? ":%d:%d" : ":%d", line, col);
+ gcc_checking_assert (l < sizeof (result));
+ }
+ else
+ result[0] = 0;
+ return result;
+}
+
+void
+diagnostic_text_output_format::report_current_module (location_t where)
+{
+ const diagnostic_context &context = get_context ();
+ pretty_printer *pp = get_printer ();
+ const line_map_ordinary *map = NULL;
+
+ if (pp_needs_newline (pp))
+ {
+ pp_newline (pp);
+ pp_needs_newline (pp) = false;
+ }
+
+ if (where <= BUILTINS_LOCATION)
+ return;
+
+ linemap_resolve_location (line_table, where,
+ LRK_MACRO_DEFINITION_LOCATION,
+ &map);
+
+ if (map && m_last_module != map)
+ {
+ m_last_module = map;
+ if (!includes_seen_p (map))
+ {
+ bool first = true, need_inc = true, was_module = MAP_MODULE_P (map);
+ expanded_location s = {};
+ do
+ {
+ where = linemap_included_from (map);
+ map = linemap_included_from_linemap (line_table, map);
+ bool is_module = MAP_MODULE_P (map);
+ s.file = LINEMAP_FILE (map);
+ s.line = SOURCE_LINE (map, where);
+ int col = -1;
+ if (first && show_column_p ())
+ {
+ s.column = SOURCE_COLUMN (map, where);
+ col = context.converted_column (s);
+ }
+ const char *line_col = maybe_line_and_column (s.line, col);
+ static const char *const msgs[] =
+ {
+ NULL,
+ N_(" from"),
+ N_("In file included from"), /* 2 */
+ N_(" included from"),
+ N_("In module"), /* 4 */
+ N_("of module"),
+ N_("In module imported at"), /* 6 */
+ N_("imported at"),
+ };
+
+ unsigned index = (was_module ? 6 : is_module ? 4
+ : need_inc ? 2 : 0) + !first;
+
+ pp_verbatim (pp, "%s%s %r%s%s%R",
+ first ? "" : was_module ? ", " : ",\n",
+ _(msgs[index]),
+ "locus", s.file, line_col);
+ first = false, need_inc = was_module, was_module = is_module;
+ }
+ while (!includes_seen_p (map));
+ pp_verbatim (pp, ":");
+ pp_newline (pp);
+ }
+ }
+}
+
+void
+default_diagnostic_text_starter (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic)
+{
+ text_output.report_current_module (diagnostic_location (diagnostic));
+ pretty_printer *const pp = text_output.get_printer ();
+ pp_set_prefix (pp, text_output.build_prefix (*diagnostic));
+}
+
+void
+default_diagnostic_text_finalizer (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic,
+ diagnostic_t)
+{
+ pretty_printer *const pp = text_output.get_printer ();
+ char *saved_prefix = pp_take_prefix (pp);
+ pp_set_prefix (pp, NULL);
+ pp_newline (pp);
+ diagnostic_show_locus (&text_output.get_context (),
+ diagnostic->richloc, diagnostic->kind, pp);
+ pp_set_prefix (pp, saved_prefix);
+ pp_flush (pp);
+}
+
+#if __GNUC__ >= 10
+# pragma GCC diagnostic pop
+#endif
@@ -33,7 +33,9 @@ class diagnostic_text_output_format : public diagnostic_output_format
{
public:
diagnostic_text_output_format (diagnostic_context &context)
- : diagnostic_output_format (context)
+ : diagnostic_output_format (context),
+ m_last_module (nullptr),
+ m_includes_seen (nullptr)
{}
~diagnostic_text_output_format ();
void on_begin_group () override {}
@@ -41,16 +43,43 @@ public:
void on_report_diagnostic (const diagnostic_info &,
diagnostic_t orig_diag_kind) override;
void on_diagram (const diagnostic_diagram &diagram) override;
+ void after_diagnostic (const diagnostic_info &) final override;
bool machine_readable_stderr_p () const final override
{
return false;
}
+ /* Helpers for writing lang-specific starters/finalizers for text output. */
+ char *build_prefix (const diagnostic_info &) const;
+ void report_current_module (location_t where);
+ void append_note (location_t location,
+ const char * gmsgid, ...) ATTRIBUTE_GCC_DIAG(3,4);
+
+
+ char *file_name_as_prefix (const char *) const;
+
+ void print_path (const diagnostic_path &path);
+
+ bool show_column_p () const { return get_context ().m_show_column; }
+
private:
void print_any_cwe (const diagnostic_info &diagnostic);
void print_any_rules (const diagnostic_info &diagnostic);
void print_option_information (const diagnostic_info &diagnostic,
diagnostic_t orig_diag_kind);
+
+ label_text get_location_text (const expanded_location &s) const;
+ bool includes_seen_p (const line_map_ordinary *map);
+
+ void show_any_path (const diagnostic_info &diagnostic);
+
+ /* Used to detect when the input file stack has changed since last
+ described. */
+ const line_map_ordinary *m_last_module;
+
+ /* Include files that report_current_module has already listed the
+ include path for. */
+ hash_set<location_t, false, location_hash> *m_includes_seen;
};
#endif /* ! GCC_DIAGNOSTIC_FORMAT_TEXT_H */
@@ -39,10 +39,17 @@ public:
diagnostic_t orig_diag_kind) = 0;
virtual void on_diagram (const diagnostic_diagram &diagram) = 0;
+ virtual void after_diagnostic (const diagnostic_info &) = 0;
virtual bool machine_readable_stderr_p () const = 0;
+ diagnostic_context &get_context () const { return m_context; }
pretty_printer *get_printer () const { return m_context.m_printer; }
+ text_art::theme *get_diagram_theme () const
+ {
+ return m_context.get_diagram_theme ();
+ }
+
protected:
diagnostic_output_format (diagnostic_context &context)
: m_context (context)
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree.h"
#include "diagnostic.h"
#include "diagnostic-macro-unwinding.h"
+#include "diagnostic-format-text.h"
#include "intl.h"
/* This is a pair made of a location and the line map it originated
@@ -72,7 +73,7 @@ struct loc_map_pair
function. */
void
-maybe_unwind_expanded_macro_loc (diagnostic_context *context,
+maybe_unwind_expanded_macro_loc (diagnostic_text_output_format &text_output,
location_t where)
{
const struct line_map *map;
@@ -177,9 +178,9 @@ maybe_unwind_expanded_macro_loc (diagnostic_context *context,
const int resolved_def_loc_line = SOURCE_LINE (m, l0);
if (ix == 0 && saved_location_line != resolved_def_loc_line)
{
- diagnostic_append_note (context, resolved_def_loc,
- "in definition of macro %qs",
- linemap_map_get_macro_name (iter->map));
+ text_output.append_note (resolved_def_loc,
+ "in definition of macro %qs",
+ linemap_map_get_macro_name (iter->map));
/* At this step, as we've printed the context of the macro
definition, we don't want to print the context of its
expansion, otherwise, it'd be redundant. */
@@ -194,9 +195,9 @@ maybe_unwind_expanded_macro_loc (diagnostic_context *context,
iter->map->get_expansion_point_location (),
LRK_MACRO_DEFINITION_LOCATION, NULL);
- diagnostic_append_note (context, resolved_exp_loc,
- "in expansion of macro %qs",
- linemap_map_get_macro_name (iter->map));
+ text_output.append_note (resolved_exp_loc,
+ "in expansion of macro %qs",
+ linemap_map_get_macro_name (iter->map));
}
}
@@ -214,8 +215,8 @@ maybe_unwind_expanded_macro_loc (diagnostic_context *context,
that is similar to what is done for function call stacks, or
template instantiation contexts. */
void
-virt_loc_aware_diagnostic_finalizer (diagnostic_context *context,
+virt_loc_aware_diagnostic_finalizer (diagnostic_text_output_format &text_output,
const diagnostic_info *diagnostic)
{
- maybe_unwind_expanded_macro_loc (context, diagnostic_location (diagnostic));
+ maybe_unwind_expanded_macro_loc (text_output, diagnostic_location (diagnostic));
}
@@ -20,10 +20,10 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_DIAGNOSTIC_MACRO_UNWINDING_H
#define GCC_DIAGNOSTIC_MACRO_UNWINDING_H
-void virt_loc_aware_diagnostic_finalizer (diagnostic_context *,
+void virt_loc_aware_diagnostic_finalizer (diagnostic_text_output_format &,
const diagnostic_info *);
-extern void maybe_unwind_expanded_macro_loc (diagnostic_context *context,
+extern void maybe_unwind_expanded_macro_loc (diagnostic_text_output_format &,
location_t where);
#endif /* ! GCC_DIAGNOSTIC_MACRO_UNWINDING_H */
@@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see
#include "selftest-diagnostic.h"
#include "selftest-diagnostic-path.h"
#include "text-art/theme.h"
+#include "diagnostic-format-text.h"
/* Disable warnings about missing quoting in GCC diagnostics for the print
calls below. */
@@ -224,10 +225,12 @@ namespace {
class path_label : public range_label
{
public:
- path_label (const diagnostic_context &ctxt,
- const diagnostic_path &path,
- unsigned start_idx)
- : m_ctxt (ctxt), m_path (path), m_start_idx (start_idx), m_effects (*this)
+ path_label (const diagnostic_path &path,
+ unsigned start_idx,
+ bool colorize,
+ bool allow_emojis)
+ : m_path (path), m_start_idx (start_idx), m_effects (*this),
+ m_colorize (colorize), m_allow_emojis (allow_emojis)
{}
label_text get_text (unsigned range_idx) const final override
@@ -238,33 +241,31 @@ class path_label : public range_label
/* Get the description of the event, perhaps with colorization:
normally, we don't colorize within a range_label, but this
is special-cased for diagnostic paths. */
- const bool colorize = pp_show_color (m_ctxt.m_printer);
- label_text event_text (event.get_desc (colorize));
+ label_text event_text (event.get_desc (m_colorize));
gcc_assert (event_text.get ());
const diagnostic_event::meaning meaning (event.get_meaning ());
pretty_printer pp;
- pp_show_color (&pp) = colorize;
+ pp_show_color (&pp) = m_colorize;
diagnostic_event_id_t event_id (event_idx);
pp_printf (&pp, "%@", &event_id);
pp_space (&pp);
- if (meaning.m_verb == diagnostic_event::VERB_danger)
- if (text_art::theme *theme = m_ctxt.get_diagram_theme ())
- if (theme->emojis_p ())
- {
- pp_unicode_character (&pp, 0x26A0); /* U+26A0 WARNING SIGN. */
- /* Append U+FE0F VARIATION SELECTOR-16 to select the emoji
- variation of the char. */
- pp_unicode_character (&pp, 0xFE0F);
- /* U+26A0 WARNING SIGN has East_Asian_Width == Neutral, but in its
- emoji variant is printed (by vte at least) with a 2nd half
- overlapping the next char. Hence we add two spaces here: a space
- to be covered by this overlap, plus another space of padding. */
- pp_string (&pp, " ");
- }
+ if (meaning.m_verb == diagnostic_event::VERB_danger
+ && m_allow_emojis)
+ {
+ pp_unicode_character (&pp, 0x26A0); /* U+26A0 WARNING SIGN. */
+ /* Append U+FE0F VARIATION SELECTOR-16 to select the emoji
+ variation of the char. */
+ pp_unicode_character (&pp, 0xFE0F);
+ /* U+26A0 WARNING SIGN has East_Asian_Width == Neutral, but in its
+ emoji variant is printed (by vte at least) with a 2nd half
+ overlapping the next char. Hence we add two spaces here: a space
+ to be covered by this overlap, plus another space of padding. */
+ pp_string (&pp, " ");
+ }
pp_printf (&pp, "%s", event_text.get ());
@@ -316,10 +317,11 @@ class path_label : public range_label
return &m_path.get_event (event_idx);
}
- const diagnostic_context &m_ctxt;
const diagnostic_path &m_path;
unsigned m_start_idx;
path_label_effects m_effects;
+ const bool m_colorize;
+ const bool m_allow_emojis;
};
/* Return true if E1 and E2 can be consolidated into the same run of events
@@ -507,17 +509,18 @@ struct event_range
int m_max_label_source_column;
};
- event_range (const diagnostic_context &ctxt,
- const diagnostic_path &path, unsigned start_idx,
+ event_range (const diagnostic_path &path, unsigned start_idx,
const diagnostic_event &initial_event,
per_thread_summary &t,
- bool show_event_links)
+ bool show_event_links,
+ bool colorize_labels,
+ bool allow_emojis)
: m_path (path),
m_initial_event (initial_event),
m_logical_loc (initial_event.get_logical_location ()),
m_stack_depth (initial_event.get_stack_depth ()),
m_start_idx (start_idx), m_end_idx (start_idx),
- m_path_label (ctxt, path, start_idx),
+ m_path_label (path, start_idx, colorize_labels, allow_emojis),
m_richloc (initial_event.get_location (), &m_path_label, nullptr),
m_thread_id (initial_event.get_thread_id ()),
m_per_thread_summary (t),
@@ -601,14 +604,17 @@ struct event_range
return true;
}
- /* Print the events in this range to DC, typically as a single
+ /* Print the events in this range to PP, typically as a single
call to the printer's diagnostic_show_locus. */
- void print (diagnostic_context &dc, pretty_printer *pp,
+ void print (diagnostic_text_output_format &text_output,
+ pretty_printer *pp,
diagnostic_source_effect_info *effect_info)
{
location_t initial_loc = m_initial_event.get_location ();
+ diagnostic_context &dc = text_output.get_context ();
+
/* Emit a span indicating the filename (and line/column) if the
line has changed relative to the last call to
diagnostic_show_locus. */
@@ -649,7 +655,7 @@ struct event_range
if (linemap_location_from_macro_expansion_p (line_table, initial_loc))
{
gcc_assert (m_start_idx == m_end_idx);
- maybe_unwind_expanded_macro_loc (&dc, initial_loc);
+ maybe_unwind_expanded_macro_loc (text_output, initial_loc);
}
}
@@ -674,7 +680,7 @@ struct event_range
struct path_summary
{
- path_summary (const diagnostic_context &ctxt,
+ path_summary (diagnostic_text_output_format &text_output,
const diagnostic_path &path,
bool check_rich_locations,
bool show_event_links = true);
@@ -736,7 +742,7 @@ per_thread_summary::interprocedural_p () const
/* path_summary's ctor. */
-path_summary::path_summary (const diagnostic_context &ctxt,
+path_summary::path_summary (diagnostic_text_output_format &text_output,
const diagnostic_path &path,
bool check_rich_locations,
bool show_event_links)
@@ -754,12 +760,18 @@ path_summary::path_summary (const diagnostic_context &ctxt,
pts.update_depth_limits (event.get_stack_depth ());
if (cur_event_range)
- if (cur_event_range->maybe_add_event (ctxt, event,
+ if (cur_event_range->maybe_add_event (text_output.get_context (),
+ event,
idx, check_rich_locations))
continue;
- cur_event_range = new event_range (ctxt, path, idx, event, pts,
- show_event_links);
+ const bool colorize = pp_show_color (text_output.get_printer ());
+ auto theme = text_output.get_diagram_theme ();
+ const bool allow_emojis = theme ? theme->emojis_p (): false;
+ cur_event_range = new event_range (path, idx, event, pts,
+ show_event_links,
+ colorize,
+ allow_emojis);
m_ranges.safe_push (cur_event_range);
pts.m_event_ranges.safe_push (cur_event_range);
pts.m_last_event = &event;
@@ -812,7 +824,7 @@ public:
}
void
- print_swimlane_for_event_range (diagnostic_context &dc,
+ print_swimlane_for_event_range (diagnostic_text_output_format &text_output,
pretty_printer *pp,
event_range *range,
diagnostic_source_effect_info *effect_info)
@@ -823,7 +835,7 @@ public:
const char *end_line_color = colorize_stop (pp_show_color (pp));
text_art::ascii_theme fallback_theme;
- text_art::theme *theme = dc.get_diagram_theme ();
+ text_art::theme *theme = text_output.get_diagram_theme ();
if (!theme)
theme = &fallback_theme;
@@ -894,7 +906,7 @@ public:
}
pp_set_prefix (pp, prefix);
pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
- range->print (dc, pp, effect_info);
+ range->print (text_output, pp, effect_info);
pp_set_prefix (pp, saved_prefix);
write_indent (pp, m_cur_indent + per_frame_indent);
@@ -904,7 +916,7 @@ public:
pp_newline (pp);
}
else
- range->print (dc, pp, effect_info);
+ range->print (text_output, pp, effect_info);
if (const event_range *next_range = get_any_next_range ())
{
@@ -989,8 +1001,8 @@ private:
unsigned m_num_printed;
};
-/* Print path_summary PS to DC, giving an overview of the interprocedural
- calls and returns.
+/* Print path_summary PS to TEXT_OUTPUT, giving an overview of the
+ interprocedural calls and returns.
Print the event descriptions in a nested form, printing the event
descriptions within calls to diagnostic_show_locus, using labels to
@@ -1024,10 +1036,10 @@ private:
static void
print_path_summary_as_text (const path_summary &ps,
- diagnostic_context &dc,
+ diagnostic_text_output_format &text_output,
bool show_depths)
{
- pretty_printer *const pp = dc.m_printer;
+ pretty_printer *const pp = text_output.get_printer ();
std::vector<thread_event_printer> thread_event_printers;
for (auto t : ps.m_per_thread_summary)
@@ -1054,21 +1066,21 @@ print_path_summary_as_text (const path_summary &ps,
of this range. */
diagnostic_source_effect_info effect_info;
effect_info.m_leading_in_edge_column = last_out_edge_column;
- tep.print_swimlane_for_event_range (dc, pp, range, &effect_info);
+ tep.print_swimlane_for_event_range (text_output, pp, range, &effect_info);
last_out_edge_column = effect_info.m_trailing_out_edge_column;
}
}
} /* end of anonymous namespace for path-printing code. */
-/* Print PATH according to this context's path_format. */
+/* Print PATH according to the context's path_format. */
void
-diagnostic_context::print_path (const diagnostic_path &path)
+diagnostic_text_output_format::print_path (const diagnostic_path &path)
{
const unsigned num_events = path.num_events ();
- switch (get_path_format ())
+ switch (get_context ().get_path_format ())
{
case DPF_NONE:
/* Do nothing. */
@@ -1083,7 +1095,7 @@ diagnostic_context::print_path (const diagnostic_path &path)
label_text event_text (event.get_desc (false));
gcc_assert (event_text.get ());
diagnostic_event_id_t event_id (i);
- if (this->show_path_depths_p ())
+ if (get_context ().show_path_depths_p ())
{
int stack_depth = event.get_stack_depth ();
/* -fdiagnostics-path-format=separate-events doesn't print
@@ -1115,13 +1127,14 @@ diagnostic_context::print_path (const diagnostic_path &path)
{
/* Consolidate related events. */
path_summary summary (*this, path, true,
- m_source_printing.show_event_links_p);
- char *saved_prefix = pp_take_prefix (m_printer);
- pp_set_prefix (m_printer, NULL);
+ get_context ().m_source_printing.show_event_links_p);
+ pretty_printer *const pp = get_printer ();
+ char *saved_prefix = pp_take_prefix (pp);
+ pp_set_prefix (pp, NULL);
print_path_summary_as_text (summary, *this,
- show_path_depths_p ());
- pp_flush (m_printer);
- pp_set_prefix (m_printer, saved_prefix);
+ get_context ().show_path_depths_p ());
+ pp_flush (pp);
+ pp_set_prefix (pp, saved_prefix);
}
break;
}
@@ -1161,10 +1174,11 @@ test_empty_path (pretty_printer *event_pp)
ASSERT_FALSE (path.interprocedural_p ());
test_diagnostic_context dc;
- path_summary summary (dc, path, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, false);
ASSERT_EQ (summary.get_num_ranges (), 0);
- print_path_summary_as_text (summary, dc, true);
+ print_path_summary_as_text (summary, text_output, true);
ASSERT_STREQ ("",
pp_formatted_text (dc.m_printer));
}
@@ -1182,10 +1196,11 @@ test_intraprocedural_path (pretty_printer *event_pp)
ASSERT_FALSE (path.interprocedural_p ());
test_diagnostic_context dc;
- path_summary summary (dc, path, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, false);
ASSERT_EQ (summary.get_num_ranges (), 1);
- print_path_summary_as_text (summary, dc, true);
+ print_path_summary_as_text (summary, text_output, true);
ASSERT_STREQ (" `foo': events 1-2 (depth 0)\n"
" (1): first `free'\n"
" (2): double `free'\n",
@@ -1217,11 +1232,12 @@ test_interprocedural_path_1 (pretty_printer *event_pp)
{
test_diagnostic_context dc;
- path_summary summary (dc, path, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, false);
ASSERT_EQ (summary.get_num_ranges (), 9);
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
- print_path_summary_as_text (summary, dc, true);
+ print_path_summary_as_text (summary, text_output, true);
ASSERT_STREQ
(" `test': events 1-2 (depth 0)\n"
" |\n"
@@ -1277,8 +1293,9 @@ test_interprocedural_path_1 (pretty_printer *event_pp)
{
test_diagnostic_context dc;
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
- path_summary summary (dc, path, false);
- print_path_summary_as_text (summary, dc, true);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, false);
+ print_path_summary_as_text (summary, text_output, true);
ASSERT_STREQ
(" `test': events 1-2 (depth 0)\n"
" │\n"
@@ -1352,10 +1369,11 @@ test_interprocedural_path_2 (pretty_printer *event_pp)
{
test_diagnostic_context dc;
- path_summary summary (dc, path, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, false);
ASSERT_EQ (summary.get_num_ranges (), 5);
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
- print_path_summary_as_text (summary, dc, true);
+ print_path_summary_as_text (summary, text_output, true);
ASSERT_STREQ
(" `foo': events 1-2 (depth 0)\n"
" |\n"
@@ -1387,8 +1405,9 @@ test_interprocedural_path_2 (pretty_printer *event_pp)
{
test_diagnostic_context dc;
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
- path_summary summary (dc, path, false);
- print_path_summary_as_text (summary, dc, true);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, false);
+ print_path_summary_as_text (summary, text_output, true);
ASSERT_STREQ
(" `foo': events 1-2 (depth 0)\n"
" │\n"
@@ -1437,10 +1456,11 @@ test_recursion (pretty_printer *event_pp)
test_diagnostic_context dc;
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
- path_summary summary (dc, path, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, false);
ASSERT_EQ (summary.get_num_ranges (), 4);
- print_path_summary_as_text (summary, dc, true);
+ print_path_summary_as_text (summary, text_output, true);
ASSERT_STREQ
(" `factorial': events 1-2 (depth 0)\n"
" |\n"
@@ -1467,8 +1487,9 @@ test_recursion (pretty_printer *event_pp)
test_diagnostic_context dc;
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
- path_summary summary (dc, path, false);
- print_path_summary_as_text (summary, dc, true);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, false);
+ print_path_summary_as_text (summary, text_output, true);
ASSERT_STREQ
(" `factorial': events 1-2 (depth 0)\n"
" │\n"
@@ -1587,8 +1608,9 @@ test_control_flow_1 (const line_table_case &case_,
test_diagnostic_context dc;
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_event_links_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-3\n"
"FILENAME:3:7:\n"
@@ -1611,8 +1633,9 @@ test_control_flow_1 (const line_table_case &case_,
test_diagnostic_context dc;
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_event_links_p = false;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-3\n"
"FILENAME:3:7:\n"
@@ -1633,8 +1656,9 @@ test_control_flow_1 (const line_table_case &case_,
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_line_numbers_p = true;
dc.m_source_printing.show_event_links_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-3\n"
"FILENAME:3:7:\n"
@@ -1658,8 +1682,9 @@ test_control_flow_1 (const line_table_case &case_,
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_line_numbers_p = true;
dc.m_source_printing.show_event_links_p = false;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-3\n"
"FILENAME:3:7:\n"
@@ -1679,8 +1704,9 @@ test_control_flow_1 (const line_table_case &case_,
test_diagnostic_context dc;
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
dc.m_source_printing.show_event_links_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-3\n"
"FILENAME:3:7:\n"
@@ -1704,8 +1730,9 @@ test_control_flow_1 (const line_table_case &case_,
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
dc.m_source_printing.show_event_links_p = true;
dc.m_source_printing.show_line_numbers_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-3\n"
"FILENAME:3:7:\n"
@@ -1773,8 +1800,9 @@ test_control_flow_2 (const line_table_case &case_,
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_event_links_p = true;
dc.m_source_printing.show_line_numbers_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-3\n"
"FILENAME:4:31:\n"
@@ -1858,8 +1886,9 @@ test_control_flow_3 (const line_table_case &case_,
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_event_links_p = true;
dc.m_source_printing.show_line_numbers_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-2\n"
"FILENAME:3:19:\n"
@@ -1914,8 +1943,9 @@ assert_cfg_edge_path_streq (const location &loc,
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_event_links_p = true;
dc.m_source_printing.show_line_numbers_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ_AT (loc, expected_str,
pp_formatted_text (dc.m_printer));
}
@@ -2236,8 +2266,9 @@ test_control_flow_5 (const line_table_case &case_,
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_event_links_p = true;
dc.m_source_printing.show_line_numbers_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-5\n"
"FILENAME:1:6:\n"
@@ -2323,8 +2354,9 @@ test_control_flow_6 (const line_table_case &case_,
dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
dc.m_source_printing.show_event_links_p = true;
dc.m_source_printing.show_line_numbers_p = true;
- path_summary summary (dc, path, true);
- print_path_summary_as_text (summary, dc, false);
+ diagnostic_text_output_format text_output (dc);
+ path_summary summary (text_output, path, true);
+ print_path_summary_as_text (summary, text_output, false);
ASSERT_STREQ
(" events 1-3\n"
"FILENAME:6:25:\n"
@@ -85,11 +85,11 @@ build_message_string (const char *msg, ...)
return str;
}
-/* Same as diagnostic_build_prefix, but only the source FILE is given. */
+/* Same as build_prefix, but only the source FILE is given. */
char *
-file_name_as_prefix (diagnostic_context *context, const char *f)
+diagnostic_text_output_format::file_name_as_prefix (const char *f) const
{
- pretty_printer *const pp = context->m_printer;
+ pretty_printer *const pp = get_printer ();
const char *locus_cs
= colorize_start (pp_show_color (pp), "locus");
const char *locus_ce = colorize_stop (pp_show_color (pp));
@@ -223,13 +223,12 @@ diagnostic_context::initialize (int n_opts)
m_max_errors = 0;
m_internal_error = nullptr;
m_adjust_diagnostic_info = nullptr;
- m_text_callbacks.m_begin_diagnostic = default_diagnostic_starter;
+ m_text_callbacks.m_begin_diagnostic = default_diagnostic_text_starter;
m_text_callbacks.m_start_span = default_diagnostic_start_span_fn;
- m_text_callbacks.m_end_diagnostic = default_diagnostic_finalizer;
+ m_text_callbacks.m_end_diagnostic = default_diagnostic_text_finalizer;
m_option_mgr = nullptr;
m_urlifier = nullptr;
m_last_location = UNKNOWN_LOCATION;
- m_last_module = nullptr;
m_client_aux_data = nullptr;
m_lock = 0;
m_inhibit_notes_p = false;
@@ -259,7 +258,6 @@ diagnostic_context::initialize (int n_opts)
m_output_format = new diagnostic_text_output_format (*this);
m_set_locations_cb = nullptr;
m_ice_handler_cb = nullptr;
- m_includes_seen = nullptr;
m_client_data_hooks = nullptr;
m_diagrams.m_theme = nullptr;
m_original_argv = nullptr;
@@ -381,12 +379,6 @@ diagnostic_context::finish ()
m_edit_context_ptr = nullptr;
}
- if (m_includes_seen)
- {
- delete m_includes_seen;
- m_includes_seen = nullptr;
- }
-
if (m_client_data_hooks)
{
delete m_client_data_hooks;
@@ -554,36 +546,14 @@ diagnostic_context::converted_column (expanded_location s) const
return one_based_col + (m_column_origin - 1);
}
-/* Return a formatted line and column ':%line:%column'. Elided if
- line == 0 or col < 0. (A column of 0 may be valid due to the
- -fdiagnostics-column-origin option.)
- The result is a statically allocated buffer. */
-
-static const char *
-maybe_line_and_column (int line, int col)
-{
- static char result[32];
-
- if (line)
- {
- size_t l
- = snprintf (result, sizeof (result),
- col >= 0 ? ":%d:%d" : ":%d", line, col);
- gcc_checking_assert (l < sizeof (result));
- }
- else
- result[0] = 0;
- return result;
-}
-
/* Return a string describing a location e.g. "foo.c:42:10". */
label_text
-diagnostic_context::get_location_text (const expanded_location &s) const
+diagnostic_context::get_location_text (const expanded_location &s,
+ bool colorize) const
{
- pretty_printer *pp = m_printer;
- const char *locus_cs = colorize_start (pp_show_color (pp), "locus");
- const char *locus_ce = colorize_stop (pp_show_color (pp));
+ const char *locus_cs = colorize_start (colorize, "locus");
+ const char *locus_ce = colorize_stop (colorize);
const char *file = s.file ? s.file : progname;
int line = 0;
int col = -1;
@@ -618,24 +588,24 @@ get_diagnostic_kind_text (diagnostic_t kind)
diagnostic, e.g. "foo.c:42:10: error: ". The caller is responsible for
freeing the memory. */
char *
-diagnostic_build_prefix (diagnostic_context *context,
- const diagnostic_info *diagnostic)
+diagnostic_text_output_format::
+build_prefix (const diagnostic_info &diagnostic) const
{
- gcc_assert (diagnostic->kind < DK_LAST_DIAGNOSTIC_KIND);
+ gcc_assert (diagnostic.kind < DK_LAST_DIAGNOSTIC_KIND);
- const char *text = _(diagnostic_kind_text[diagnostic->kind]);
+ const char *text = _(diagnostic_kind_text[diagnostic.kind]);
const char *text_cs = "", *text_ce = "";
- pretty_printer *pp = context->m_printer;
+ pretty_printer *pp = get_printer ();
- if (diagnostic_kind_color[diagnostic->kind])
+ if (diagnostic_kind_color[diagnostic.kind])
{
text_cs = colorize_start (pp_show_color (pp),
- diagnostic_kind_color[diagnostic->kind]);
+ diagnostic_kind_color[diagnostic.kind]);
text_ce = colorize_stop (pp_show_color (pp));
}
- const expanded_location s = diagnostic_expand_location (diagnostic);
- label_text location_text = context->get_location_text (s);
+ const expanded_location s = diagnostic_expand_location (&diagnostic);
+ label_text location_text = get_location_text (s);
char *result = build_message_string ("%s %s%s%s", location_text.get (),
text_cs, text, text_ce);
@@ -837,104 +807,11 @@ diagnostic_context::action_after_output (diagnostic_t diag_kind)
}
}
-/* Only dump the "In file included from..." stack once for each file. */
-
-bool
-diagnostic_context::includes_seen_p (const line_map_ordinary *map)
-{
- /* No include path for main. */
- if (MAIN_FILE_P (map))
- return true;
-
- /* Always identify C++ modules, at least for now. */
- auto probe = map;
- if (linemap_check_ordinary (map)->reason == LC_RENAME)
- /* The module source file shows up as LC_RENAME inside LC_MODULE. */
- probe = linemap_included_from_linemap (line_table, map);
- if (MAP_MODULE_P (probe))
- return false;
-
- if (!m_includes_seen)
- m_includes_seen = new hash_set<location_t, false, location_hash>;
-
- /* Hash the location of the #include directive to better handle files
- that are included multiple times with different macros defined. */
- return m_includes_seen->add (linemap_included_from (map));
-}
-
-void
-diagnostic_context::report_current_module (location_t where)
-{
- pretty_printer *pp = m_printer;
- const line_map_ordinary *map = NULL;
-
- if (pp_needs_newline (m_printer))
- {
- pp_newline (pp);
- pp_needs_newline (pp) = false;
- }
-
- if (where <= BUILTINS_LOCATION)
- return;
-
- linemap_resolve_location (line_table, where,
- LRK_MACRO_DEFINITION_LOCATION,
- &map);
-
- if (map && m_last_module != map)
- {
- m_last_module = map;
- if (!includes_seen_p (map))
- {
- bool first = true, need_inc = true, was_module = MAP_MODULE_P (map);
- expanded_location s = {};
- do
- {
- where = linemap_included_from (map);
- map = linemap_included_from_linemap (line_table, map);
- bool is_module = MAP_MODULE_P (map);
- s.file = LINEMAP_FILE (map);
- s.line = SOURCE_LINE (map, where);
- int col = -1;
- if (first && m_show_column)
- {
- s.column = SOURCE_COLUMN (map, where);
- col = converted_column (s);
- }
- const char *line_col = maybe_line_and_column (s.line, col);
- static const char *const msgs[] =
- {
- NULL,
- N_(" from"),
- N_("In file included from"), /* 2 */
- N_(" included from"),
- N_("In module"), /* 4 */
- N_("of module"),
- N_("In module imported at"), /* 6 */
- N_("imported at"),
- };
-
- unsigned index = (was_module ? 6 : is_module ? 4
- : need_inc ? 2 : 0) + !first;
-
- pp_verbatim (pp, "%s%s %r%s%s%R",
- first ? "" : was_module ? ", " : ",\n",
- _(msgs[index]),
- "locus", s.file, line_col);
- first = false, need_inc = was_module, was_module = is_module;
- }
- while (!includes_seen_p (map));
- pp_verbatim (pp, ":");
- pp_newline (pp);
- }
- }
-}
-
/* If DIAGNOSTIC has a diagnostic_path and this context supports
printing paths, print the path. */
void
-diagnostic_context::show_any_path (const diagnostic_info &diagnostic)
+diagnostic_text_output_format::show_any_path (const diagnostic_info &diagnostic)
{
const diagnostic_path *path = diagnostic.richloc->get_path ();
if (!path)
@@ -969,39 +846,16 @@ logical_location::function_p () const
}
}
-void
-default_diagnostic_starter (diagnostic_context *context,
- const diagnostic_info *diagnostic)
-{
- diagnostic_report_current_module (context, diagnostic_location (diagnostic));
- pretty_printer *const pp = context->m_printer;
- pp_set_prefix (pp, diagnostic_build_prefix (context, diagnostic));
-}
-
void
default_diagnostic_start_span_fn (diagnostic_context *context,
expanded_location exploc)
{
- label_text text = context->get_location_text (exploc);
pretty_printer *pp = context->m_printer;
+ label_text text = context->get_location_text (exploc, pp_show_color (pp));
pp_string (pp, text.get ());
pp_newline (pp);
}
-void
-default_diagnostic_finalizer (diagnostic_context *context,
- const diagnostic_info *diagnostic,
- diagnostic_t)
-{
- pretty_printer *const pp = context->m_printer;
- char *saved_prefix = pp_take_prefix (pp);
- pp_set_prefix (pp, NULL);
- pp_newline (pp);
- diagnostic_show_locus (context, diagnostic->richloc, diagnostic->kind, pp);
- pp_set_prefix (pp, saved_prefix);
- pp_flush (pp);
-}
-
/* Interface to specify diagnostic kind overrides. Returns the
previous setting, or DK_UNSPECIFIED if the parameters are out of
range. If OPTION_ID is zero, the new setting is for all the
@@ -1436,7 +1290,7 @@ diagnostic_context::report_diagnostic (diagnostic_info *diagnostic)
m_lock--;
- show_any_path (*diagnostic);
+ m_output_format->after_diagnostic (*diagnostic);
return true;
}
@@ -1492,12 +1346,14 @@ trim_filename (const char *name)
return p;
}
-/* Add a note with text GMSGID and with LOCATION to the diagnostic CONTEXT. */
+/* Add a purely textual note with text GMSGID and with LOCATION. */
+
void
-diagnostic_append_note (diagnostic_context *context,
- location_t location,
- const char * gmsgid, ...)
+diagnostic_text_output_format::append_note (location_t location,
+ const char * gmsgid, ...)
{
+ diagnostic_context *context = &get_context ();
+
diagnostic_info diagnostic;
va_list ap;
rich_location richloc (line_table, location);
@@ -1509,10 +1365,9 @@ diagnostic_append_note (diagnostic_context *context,
va_end (ap);
return;
}
- pretty_printer *pp = context->m_printer;
+ pretty_printer *pp = get_printer ();
char *saved_prefix = pp_take_prefix (pp);
- pp_set_prefix (pp,
- diagnostic_build_prefix (context, &diagnostic));
+ pp_set_prefix (pp, build_prefix (diagnostic));
pp_format (pp, &diagnostic.message);
pp_output_formatted_text (pp);
pp_destroy_prefix (pp);
@@ -1983,7 +1838,7 @@ assert_location_text (const char *expected_loc_text,
xloc.data = NULL;
xloc.sysp = false;
- label_text actual_loc_text = dc.get_location_text (xloc);
+ label_text actual_loc_text = dc.get_location_text (xloc, false);
ASSERT_STREQ (expected_loc_text, actual_loc_text.get ());
}
@@ -171,15 +171,15 @@ struct diagnostic_info
};
/* Forward declarations. */
-typedef void (*diagnostic_starter_fn) (diagnostic_context *,
- const diagnostic_info *);
+typedef void (*diagnostic_text_starter_fn) (diagnostic_text_output_format &,
+ const diagnostic_info *);
typedef void (*diagnostic_start_span_fn) (diagnostic_context *,
expanded_location);
-typedef void (*diagnostic_finalizer_fn) (diagnostic_context *,
- const diagnostic_info *,
- diagnostic_t);
+typedef void (*diagnostic_text_finalizer_fn) (diagnostic_text_output_format &,
+ const diagnostic_info *,
+ diagnostic_t);
/* Abstract base class for the diagnostic subsystem to make queries
about command-line options. */
@@ -352,12 +352,12 @@ class diagnostic_context
{
public:
/* Give access to m_text_callbacks. */
- friend diagnostic_starter_fn &
- diagnostic_starter (diagnostic_context *context);
+ friend diagnostic_text_starter_fn &
+ diagnostic_text_starter (diagnostic_context *context);
friend diagnostic_start_span_fn &
diagnostic_start_span (diagnostic_context *context);
- friend diagnostic_finalizer_fn &
- diagnostic_finalizer (diagnostic_context *context);
+ friend diagnostic_text_finalizer_fn &
+ diagnostic_text_finalizer (diagnostic_context *context);
friend class diagnostic_text_output_format;
@@ -400,8 +400,6 @@ public:
bool report_diagnostic (diagnostic_info *);
- void report_current_module (location_t where);
-
void check_max_errors (bool flush);
void action_after_output (diagnostic_t diag_kind);
@@ -546,7 +544,8 @@ public:
return m_lang_mask;
}
- label_text get_location_text (const expanded_location &s) const;
+ label_text get_location_text (const expanded_location &s,
+ bool colorize) const;
bool diagnostic_impl (rich_location *, const diagnostic_metadata *,
diagnostic_option_id, const char *,
@@ -557,10 +556,6 @@ public:
diagnostic_t) ATTRIBUTE_GCC_DIAG(7,0);
private:
- bool includes_seen_p (const line_map_ordinary *map);
-
- void show_any_path (const diagnostic_info &diagnostic);
-
void error_recursion () ATTRIBUTE_NORETURN;
bool diagnostic_enabled (diagnostic_info *diagnostic);
@@ -572,8 +567,6 @@ private:
pretty_printer *pp,
diagnostic_source_effect_info *effect_info);
- void print_path (const diagnostic_path &path);
-
/* Data members.
Ideally, all of these would be private. */
@@ -654,7 +647,7 @@ private:
from "/home/gdr/src/nifty_printer.h:56:
...
*/
- diagnostic_starter_fn m_begin_diagnostic;
+ diagnostic_text_starter_fn m_begin_diagnostic;
/* This function is called by diagnostic_show_locus in between
disjoint spans of source code, so that the context can print
@@ -662,7 +655,7 @@ private:
diagnostic_start_span_fn m_start_span;
/* This function is called after the diagnostic message is printed. */
- diagnostic_finalizer_fn m_end_diagnostic;
+ diagnostic_text_finalizer_fn m_end_diagnostic;
} m_text_callbacks;
public:
@@ -689,10 +682,6 @@ public:
location_t m_last_location;
private:
- /* Used to detect when the input file stack has changed since last
- described. */
- const line_map_ordinary *m_last_module;
-
int m_lock;
public:
@@ -751,10 +740,6 @@ private:
/* Optional callback for attempting to handle ICEs gracefully. */
ice_handler_callback_t m_ice_handler_cb;
- /* Include files that diagnostic_report_current_module has already listed the
- include path for. */
- hash_set<location_t, false, location_hash> *m_includes_seen;
-
/* A bundle of hooks for providing data to the context about its client
e.g. version information, plugins, etc.
Used by SARIF output to give metadata about the client that's
@@ -783,8 +768,8 @@ diagnostic_inhibit_notes (diagnostic_context * context)
/* Client supplied function to announce a diagnostic
(for text-based diagnostic output). */
-inline diagnostic_starter_fn &
-diagnostic_starter (diagnostic_context *context)
+inline diagnostic_text_starter_fn &
+diagnostic_text_starter (diagnostic_context *context)
{
return context->m_text_callbacks.m_begin_diagnostic;
}
@@ -800,8 +785,8 @@ diagnostic_start_span (diagnostic_context *context)
/* Client supplied function called after a diagnostic message is
displayed (for text-based diagnostic output). */
-inline diagnostic_finalizer_fn &
-diagnostic_finalizer (diagnostic_context *context)
+inline diagnostic_text_finalizer_fn &
+diagnostic_text_finalizer (diagnostic_context *context)
{
return context->m_text_callbacks.m_end_diagnostic;
}
@@ -887,13 +872,6 @@ diagnostic_finish (diagnostic_context *context)
context->finish ();
}
-inline void
-diagnostic_report_current_module (diagnostic_context *context,
- location_t where)
-{
- context->report_current_module (where);
-}
-
inline void
diagnostic_show_locus (diagnostic_context *context,
rich_location *richloc,
@@ -975,16 +953,14 @@ extern void diagnostic_set_info_translated (diagnostic_info *, const char *,
va_list *, rich_location *,
diagnostic_t)
ATTRIBUTE_GCC_DIAG(2,0);
-extern void diagnostic_append_note (diagnostic_context *, location_t,
- const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
#endif
-extern char *diagnostic_build_prefix (diagnostic_context *, const diagnostic_info *);
-void default_diagnostic_starter (diagnostic_context *, const diagnostic_info *);
+void default_diagnostic_text_starter (diagnostic_text_output_format &,
+ const diagnostic_info *);
void default_diagnostic_start_span_fn (diagnostic_context *,
expanded_location);
-void default_diagnostic_finalizer (diagnostic_context *,
- const diagnostic_info *,
- diagnostic_t);
+void default_diagnostic_text_finalizer (diagnostic_text_output_format &,
+ const diagnostic_info *,
+ diagnostic_t);
void diagnostic_set_caret_max_width (diagnostic_context *context, int value);
inline void
@@ -1050,7 +1026,6 @@ diagnostic_same_line (const diagnostic_context *context,
extern const char *diagnostic_get_color_for_kind (diagnostic_t kind);
/* Pure text formatting support functions. */
-extern char *file_name_as_prefix (diagnostic_context *, const char *);
extern char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1;
@@ -1073,4 +1048,6 @@ extern char *get_cwe_url (int cwe);
extern const char *get_diagnostic_kind_text (diagnostic_t kind);
+const char *maybe_line_and_column (int line, int col);
+
#endif /* ! GCC_DIAGNOSTIC_H */
@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see
#include "diagnostic.h"
#include "diagnostic-color.h"
#include "tree-diagnostic.h" /* tree_diagnostics_defaults */
+#include "diagnostic-format-text.h"
static int suppress_errors = 0;
@@ -1266,10 +1267,11 @@ gfc_diagnostic_build_locus_prefix (diagnostic_context *context,
[locus of primary range]: Error: Some error at (1) and (2)
*/
static void
-gfc_diagnostic_starter (diagnostic_context *context,
- const diagnostic_info *diagnostic)
+gfc_diagnostic_text_starter (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic)
{
- pretty_printer *const pp = context->m_printer;
+ diagnostic_context *const context = &text_output.get_context ();
+ pretty_printer *const pp = text_output.get_printer ();
char * kind_prefix = gfc_diagnostic_build_kind_prefix (context, diagnostic);
expanded_location s1 = diagnostic_expand_location (diagnostic);
@@ -1345,11 +1347,11 @@ gfc_diagnostic_start_span (diagnostic_context *context,
static void
-gfc_diagnostic_finalizer (diagnostic_context *context,
- const diagnostic_info *diagnostic ATTRIBUTE_UNUSED,
- diagnostic_t orig_diag_kind ATTRIBUTE_UNUSED)
+gfc_diagnostic_text_finalizer (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic ATTRIBUTE_UNUSED,
+ diagnostic_t orig_diag_kind ATTRIBUTE_UNUSED)
{
- pretty_printer *const pp = context->m_printer;
+ pretty_printer *const pp = text_output.get_printer ();
pp_destroy_prefix (pp);
pp_newline_and_flush (pp);
}
@@ -1704,9 +1706,9 @@ gfc_errors_to_warnings (bool f)
void
gfc_diagnostics_init (void)
{
- diagnostic_starter (global_dc) = gfc_diagnostic_starter;
+ diagnostic_text_starter (global_dc) = gfc_diagnostic_text_starter;
diagnostic_start_span (global_dc) = gfc_diagnostic_start_span;
- diagnostic_finalizer (global_dc) = gfc_diagnostic_finalizer;
+ diagnostic_text_finalizer (global_dc) = gfc_diagnostic_text_finalizer;
diagnostic_format_decoder (global_dc) = gfc_format_decoder;
global_dc->m_source_printing.caret_chars[0] = '1';
global_dc->m_source_printing.caret_chars[1] = '2';
@@ -1724,8 +1726,8 @@ gfc_diagnostics_finish (void)
tree_diagnostics_defaults (global_dc);
/* We still want to use the gfc starter and finalizer, not the tree
defaults. */
- diagnostic_starter (global_dc) = gfc_diagnostic_starter;
- diagnostic_finalizer (global_dc) = gfc_diagnostic_finalizer;
+ diagnostic_text_starter (global_dc) = gfc_diagnostic_text_starter;
+ diagnostic_text_finalizer (global_dc) = gfc_diagnostic_text_finalizer;
global_dc->m_source_printing.caret_chars[0] = '^';
global_dc->m_source_printing.caret_chars[1] = '^';
}
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see
#include "attribs.h"
#include "cgraph.h"
#include "target.h"
+#include "diagnostic-format-text.h"
#include <mpfr.h>
@@ -984,7 +985,7 @@ struct ggc_root_tab jit_root_tab[] =
/* Implementation of "begin_diagnostic". */
static void
-jit_begin_diagnostic (diagnostic_context */*context*/,
+jit_begin_diagnostic (diagnostic_text_output_format &,
const diagnostic_info */*diagnostic*/)
{
gcc_assert (gcc::jit::active_playback_ctxt);
@@ -997,7 +998,7 @@ jit_begin_diagnostic (diagnostic_context */*context*/,
/* Implementation of "end_diagnostic". */
static void
-jit_end_diagnostic (diagnostic_context *context,
+jit_end_diagnostic (diagnostic_text_output_format &text_output,
const diagnostic_info *diagnostic,
diagnostic_t)
{
@@ -1007,7 +1008,7 @@ jit_end_diagnostic (diagnostic_context *context,
/* Delegate to the playback context (and thence to the
recording context). */
gcc_assert (diagnostic);
- gcc::jit::active_playback_ctxt->add_diagnostic (context, *diagnostic);
+ gcc::jit::active_playback_ctxt->add_diagnostic (&text_output.get_context (), *diagnostic); // FIXME
}
/* Language hooks. */
@@ -1026,8 +1027,8 @@ jit_langhook_init (void)
}
gcc_assert (global_dc);
- diagnostic_starter (global_dc) = jit_begin_diagnostic;
- diagnostic_finalizer (global_dc) = jit_end_diagnostic;
+ diagnostic_text_starter (global_dc) = jit_begin_diagnostic;
+ diagnostic_text_finalizer (global_dc) = jit_end_diagnostic;
build_common_tree_nodes (false);
@@ -49,7 +49,7 @@ extern void lhd_print_tree_nothing (FILE *, tree, int);
extern const char *lhd_decl_printable_name (tree, int);
extern const char *lhd_dwarf_name (tree, int);
extern int lhd_types_compatible_p (tree, tree);
-extern void lhd_print_error_function (diagnostic_context *,
+extern void lhd_print_error_function (diagnostic_text_output_format &,
const char *,
const struct diagnostic_info *);
extern void lhd_set_decl_assembler_name (tree decl);
@@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see
#include "stor-layout.h"
#include "cgraph.h"
#include "debug.h"
+#include "diagnostic-format-text.h"
/* Do nothing; in many cases the default hook. */
@@ -368,16 +369,18 @@ lhd_handle_option (size_t code ATTRIBUTE_UNUSED,
/* The default function to print out name of current function that caused
an error. */
void
-lhd_print_error_function (diagnostic_context *context, const char *file,
+lhd_print_error_function (diagnostic_text_output_format &text_output,
+ const char *file,
const diagnostic_info *diagnostic)
{
+ diagnostic_context *const context = &text_output.get_context ();
if (diagnostic_last_function_changed (context, diagnostic))
{
- pretty_printer *const pp = context->m_printer;
+ pretty_printer *const pp = text_output.get_printer ();
char *old_prefix = pp_take_prefix (pp);
tree abstract_origin = diagnostic_abstract_origin (diagnostic);
char *new_prefix = (file && abstract_origin == NULL)
- ? file_name_as_prefix (context, file) : NULL;
+ ? text_output.file_name_as_prefix (file) : NULL;
pp_set_prefix (pp, new_prefix);
@@ -514,8 +514,10 @@ struct lang_hooks
in contexts where erroneously returning 0 causes problems. */
int (*types_compatible_p) (tree x, tree y);
- /* Called by report_error_function to print out function name. */
- void (*print_error_function) (diagnostic_context *, const char *,
+ /* Called by diagnostic_report_current_function to print out function name
+ for textual diagnostic output. */
+ void (*print_error_function) (diagnostic_text_output_format &,
+ const char *,
const struct diagnostic_info *);
/* Convert a character from the host's to the target's character
@@ -131,11 +131,12 @@ ResolveExpr::visit (AST::AssignmentExpr &expr)
the default bug reporting instructions, as there is no bug to report. */
static void ATTRIBUTE_NORETURN
-funny_ice_finalizer (diagnostic_context *context,
- const diagnostic_info *diagnostic, diagnostic_t diag_kind)
+funny_ice_text_finalizer (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic,
+ diagnostic_t diag_kind)
{
gcc_assert (diag_kind == DK_ICE_NOBT);
- default_diagnostic_finalizer (context, diagnostic, diag_kind);
+ default_diagnostic_text_finalizer (text_output, diagnostic, diag_kind);
fnotice (stderr, "You have broken GCC Rust. This is a feature.\n");
exit (ICE_EXIT_CODE);
}
@@ -161,7 +162,7 @@ ResolveExpr::visit (AST::IdentifierExpr &expr)
resolve. Emit a funny ICE. We set the finalizer to our custom one,
and use the lower-level emit_diagnostic () instead of the more common
internal_error_no_backtrace () in order to pass our locus. */
- diagnostic_finalizer (global_dc) = funny_ice_finalizer;
+ diagnostic_text_finalizer (global_dc) = funny_ice_text_finalizer;
emit_diagnostic (DK_ICE_NOBT, expr.get_locus (), -1,
"are you trying to break %s? how dare you?",
expr.as_string ().c_str ());
@@ -3,8 +3,8 @@
The color codes in the generated messages would also need escaping
for use within dg-error.
- Hence the simplest approach is to provide a custom diagnostic_starter_fn,
- which does nothing.
+ Hence the simplest approach is to provide a custom
+ diagnostic_text_starter_fn, which does nothing.
The resulting messages lack the "FILENAME:LINE:COL: error: " prefix
and can thus be tested using dg-begin/end-multiline-output. */
@@ -21,7 +21,7 @@
int plugin_is_GPL_compatible;
void
-noop_starter_fn (diagnostic_context *, const diagnostic_info *)
+noop_text_starter_fn (diagnostic_text_output_format &, const diagnostic_info *)
{
}
@@ -32,7 +32,7 @@ plugin_init (struct plugin_name_args *plugin_info,
if (!plugin_default_version_check (version, &gcc_version))
return 1;
- diagnostic_starter (global_dc) = noop_starter_fn;
+ diagnostic_text_starter (global_dc) = noop_text_starter_fn;
return 0;
}
@@ -165,10 +165,10 @@ pass_test_groups::execute (function *fun)
expected output. */
void
-test_diagnostic_starter (diagnostic_context *context,
- const diagnostic_info *diagnostic)
+test_diagnostic_text_starter (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic)
{
- pp_set_prefix (context->m_printer, xstrdup ("PREFIX: "));
+ pp_set_prefix (text_output.get_printer (), xstrdup ("PREFIX: "));
}
/* Custom diagnostic callback, to avoid having the path in the
@@ -224,7 +224,7 @@ plugin_init (struct plugin_name_args *plugin_info,
if (!plugin_default_version_check (version, &gcc_version))
return 1;
- diagnostic_starter (global_dc) = test_diagnostic_starter;
+ diagnostic_text_starter (global_dc) = test_diagnostic_text_starter;
diagnostic_start_span (global_dc) = test_diagnostic_start_span_fn;
global_dc->set_output_format (new test_output_format (*global_dc));
@@ -62,6 +62,7 @@
#include "print-tree.h"
#include "gcc-rich-location.h"
#include "text-range-label.h"
+#include "diagnostic-format-text.h"
int plugin_is_GPL_compatible;
@@ -124,23 +125,24 @@ static bool force_show_locus_color = false;
/* We want to verify the colorized output of diagnostic_show_locus,
but turning on colorization for everything confuses "dg-warning" etc.
Hence we special-case it within this plugin by using this modified
- version of default_diagnostic_finalizer, which, if "color" is
+ version of default_diagnostic_text_finalizer, which, if "color" is
passed in as a plugin argument turns on colorization, but just
for diagnostic_show_locus. */
static void
-custom_diagnostic_finalizer (diagnostic_context *context,
- const diagnostic_info *diagnostic,
- diagnostic_t)
+custom_diagnostic_text_finalizer (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic,
+ diagnostic_t)
{
- pretty_printer *const pp = context->m_printer;
+ pretty_printer *const pp = text_output.get_printer ();
bool old_show_color = pp_show_color (pp);
if (force_show_locus_color)
pp_show_color (pp) = true;
char *saved_prefix = pp_take_prefix (pp);
pp_set_prefix (pp, NULL);
pp_newline (pp);
- diagnostic_show_locus (context, diagnostic->richloc, diagnostic->kind);
+ diagnostic_show_locus (&text_output.get_context (),
+ diagnostic->richloc, diagnostic->kind, pp);
pp_show_color (pp) = old_show_color;
pp_set_prefix (pp, saved_prefix);
pp_flush (pp);
@@ -173,7 +175,7 @@ test_show_locus (function *fun)
location_t fnstart = fun->function_start_locus;
int fnstart_line = LOCATION_LINE (fnstart);
- diagnostic_finalizer (global_dc) = custom_diagnostic_finalizer;
+ diagnostic_text_finalizer (global_dc) = custom_diagnostic_text_finalizer;
/* Hardcode the "terminal width", to verify the behavior of
very wide lines. */
@@ -7,6 +7,7 @@
#include "coretypes.h"
#include "spellcheck.h"
#include "diagnostic.h"
+#include "diagnostic-format-text.h"
int plugin_is_GPL_compatible;
@@ -36,12 +37,12 @@ on_pragma_registration (void */*gcc_data*/, void */*user_data*/)
}
/* We add some extra testing during diagnostics by chaining up
- to the finalizer. */
+ to the text finalizer. */
-static diagnostic_finalizer_fn original_finalizer = NULL;
+static diagnostic_text_finalizer_fn original_text_finalizer = NULL;
static void
-verify_unpacked_ranges (diagnostic_context *context,
+verify_unpacked_ranges (diagnostic_text_output_format &text_output,
const diagnostic_info *diagnostic,
diagnostic_t orig_diag_kind)
{
@@ -49,13 +50,13 @@ verify_unpacked_ranges (diagnostic_context *context,
location_t loc = diagnostic_location (diagnostic);
gcc_assert (IS_ADHOC_LOC (loc));
- /* We're done testing; chain up to original finalizer. */
- gcc_assert (original_finalizer);
- original_finalizer (context, diagnostic, orig_diag_kind);
+ /* We're done testing; chain up to original text finalizer. */
+ gcc_assert (original_text_finalizer);
+ original_text_finalizer (text_output, diagnostic, orig_diag_kind);
}
static void
-verify_no_columns (diagnostic_context *context,
+verify_no_columns (diagnostic_text_output_format &text_output,
const diagnostic_info *diagnostic,
diagnostic_t orig_diag_kind)
{
@@ -63,9 +64,9 @@ verify_no_columns (diagnostic_context *context,
location_t loc = diagnostic_location (diagnostic);
gcc_assert (LOCATION_COLUMN (loc) == 0);
- /* We're done testing; chain up to original finalizer. */
- gcc_assert (original_finalizer);
- original_finalizer (context, diagnostic, orig_diag_kind);
+ /* We're done testing; chain up to original text finalizer. */
+ gcc_assert (original_text_finalizer);
+ original_text_finalizer (text_output, diagnostic, orig_diag_kind);
}
int
@@ -89,15 +90,15 @@ plugin_init (struct plugin_name_args *plugin_info,
NULL); /* void *user_data */
/* Hack in additional testing, based on the exact value supplied. */
- original_finalizer = diagnostic_finalizer (global_dc);
+ original_text_finalizer = diagnostic_text_finalizer (global_dc);
switch (base_location)
{
case LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES + 1:
- diagnostic_finalizer (global_dc) = verify_unpacked_ranges;
+ diagnostic_text_finalizer (global_dc) = verify_unpacked_ranges;
break;
case LINE_MAP_MAX_LOCATION_WITH_COLS + 1:
- diagnostic_finalizer (global_dc) = verify_no_columns;
+ diagnostic_text_finalizer (global_dc) = verify_no_columns;
break;
default:
@@ -30,25 +30,26 @@ along with GCC; see the file COPYING3. If not see
#include "diagnostic-client-data-hooks.h"
#include "langhooks.h"
#include "intl.h"
+#include "diagnostic-format-text.h"
/* Prints out, if necessary, the name of the current function
- that caused an error. Called from all error and warning functions. */
+ that caused an error. */
void
-diagnostic_report_current_function (diagnostic_context *context,
+diagnostic_report_current_function (diagnostic_text_output_format &text_output,
const diagnostic_info *diagnostic)
{
location_t loc = diagnostic_location (diagnostic);
- diagnostic_report_current_module (context, loc);
- lang_hooks.print_error_function (context, LOCATION_FILE (loc), diagnostic);
+ text_output.report_current_module (loc);
+ lang_hooks.print_error_function (text_output, LOCATION_FILE (loc), diagnostic);
}
static void
-default_tree_diagnostic_starter (diagnostic_context *context,
- const diagnostic_info *diagnostic)
+default_tree_diagnostic_text_starter (diagnostic_text_output_format &text_output,
+ const diagnostic_info *diagnostic)
{
- pretty_printer *pp = context->m_printer;
- diagnostic_report_current_function (context, diagnostic);
- pp_set_prefix (pp, diagnostic_build_prefix (context, diagnostic));
+ pretty_printer *const pp = text_output.get_printer ();
+ diagnostic_report_current_function (text_output, diagnostic);
+ pp_set_prefix (pp, text_output.build_prefix (*diagnostic));
}
/* Default tree printer. Handles declarations only. */
@@ -176,8 +177,8 @@ set_inlining_locations (diagnostic_context *,
void
tree_diagnostics_defaults (diagnostic_context *context)
{
- diagnostic_starter (context) = default_tree_diagnostic_starter;
- diagnostic_finalizer (context) = default_diagnostic_finalizer;
+ diagnostic_text_starter (context) = default_tree_diagnostic_text_starter;
+ diagnostic_text_finalizer (context) = default_diagnostic_text_finalizer;
diagnostic_format_decoder (context) = default_tree_printer;
context->set_set_locations_callback (set_inlining_locations);
context->set_client_data_hooks (make_compiler_data_hooks ());
@@ -39,6 +39,7 @@ along with GCC; see the file COPYING3. If not see
#include "diagnostic.h"
#include "langhooks.h"
#include "langhooks-def.h"
+#include "diagnostic-format-text.h"
#include "gcc-interface.h"
@@ -62,7 +63,8 @@ cc1_plugin::plugin_context *cc1_plugin::current_context;
// This is put into the lang hooks when the plugin starts.
static void
-plugin_print_error_function (diagnostic_context *context, const char *file,
+plugin_print_error_function (diagnostic_text_output_format &text_output,
+ const char *file,
const diagnostic_info *diagnostic)
{
if (current_function_decl != NULL_TREE
@@ -70,7 +72,7 @@ plugin_print_error_function (diagnostic_context *context, const char *file,
&& strcmp (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),
GCC_FE_WRAPPER_FUNCTION) == 0)
return;
- lhd_print_error_function (context, file, diagnostic);
+ lhd_print_error_function (text_output, file, diagnostic);
}