No functional change intended. gcc/ChangeLog: * Makefile.in (OBJS-libcommon): Replace diagnostic.o with diagnostics/context.o.
gcc/c-family/ChangeLog: * c-common.cc (c_family_tests): Add include of "diagnostics/diagnostics-selftests.h". Replace c_diagnostic_cc_tests with diagnostics::selftest::context_cc_tests. * c-common.h: Drop c_diagnostic_cc_tests decl. gcc/ChangeLog: * diagnostic.h (num_digits): Move to... (diagnostics::num_digits): ...here. (get_cwe_url): Move to... (diagnostics::get_cwe_url): ...here. (maybe_line_and_column): Move to... (diagnostics::maybe_line_and_column): ...here. * diagnostic.cc: Move to... * diagnostics/context.cc: ...here. * diagnostics/diagnostics-selftests.cc (run_diagnostics_selftests): Add comment about context_cc_tests. * diagnostics/diagnostics-selftests.h: Add context_cc_tests decl. * diagnostics/sarif-sink.cc: Update for file rename. * diagnostics/source-printing.cc: Update for num_digits moving to diagnostics::num_digits. * errors.cc: Update for file rename. * input.cc: Update for num_digits moving to diagnostics::num_digits. libcpp/ChangeLog: * charset.cc: Update comment for file rename. --- gcc/Makefile.in | 3 +- gcc/c-family/c-common.cc | 6 +- gcc/c-family/c-common.h | 1 - gcc/diagnostic.h | 11 +- gcc/{diagnostic.cc => diagnostics/context.cc} | 284 ++++++++++-------- gcc/diagnostics/diagnostics-selftests.cc | 6 +- gcc/diagnostics/diagnostics-selftests.h | 1 + gcc/diagnostics/sarif-sink.cc | 4 +- gcc/diagnostics/source-printing.cc | 4 +- gcc/errors.cc | 5 +- gcc/input.cc | 4 +- libcpp/charset.cc | 2 +- 12 files changed, 179 insertions(+), 152 deletions(-) rename gcc/{diagnostic.cc => diagnostics/context.cc} (90%) diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 378b9143045e..24d7b885319c 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1851,11 +1851,12 @@ OBJS = \ # Objects in libcommon.a, potentially used by all host binaries and with # no target dependencies. -OBJS-libcommon = diagnostic.o \ +OBJS-libcommon = \ diagnostic-global-context.o \ diagnostics/buffering.o \ diagnostics/changes.o \ diagnostics/color.o \ + diagnostics/context.o \ diagnostics/digraphs.o \ diagnostics/output-spec.o \ diagnostics/html-sink.o \ diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index a9f2dc442104..17c2aed6939e 100644 --- a/gcc/c-family/c-common.cc +++ b/gcc/c-family/c-common.cc @@ -56,6 +56,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-pretty-print-markup.h" #include "gcc-rich-location.h" #include "gcc-urlifier.h" +#include "diagnostics/diagnostics-selftests.h" cpp_reader *parse_in; /* Declared in c-pragma.h. */ @@ -9963,8 +9964,11 @@ c_family_tests (void) c_indentation_cc_tests (); c_pretty_print_cc_tests (); c_spellcheck_cc_tests (); - c_diagnostic_cc_tests (); c_opt_problem_cc_tests (); + + /* According to https://gcc.gnu.org/pipermail/gcc/2021-November/237703.html + this has some language-specific assumptions, so we run it here. */ + diagnostics::selftest::context_cc_tests (); } } // namespace selftest diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index ed59801a725d..7c7e21d2d0eb 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -1729,7 +1729,6 @@ extern tree braced_lists_to_strings (tree, tree); namespace selftest { /* Declarations for specific families of tests within c-family, by source file, in alphabetical order. */ - extern void c_diagnostic_cc_tests (void); extern void c_format_cc_tests (void); extern void c_indentation_cc_tests (void); extern void c_opt_problem_cc_tests (void); diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index a0ba11537083..168adee1c506 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -383,9 +383,6 @@ diagnostic_same_line (const diagnostics::context *context, extern char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1; -/* Compute the number of digits in the decimal representation of an integer. */ -extern int num_digits (int); - inline bool warning_enabled_at (location_t loc, diagnostics::option_id opt_id) { @@ -398,11 +395,13 @@ option_unspecified_p (diagnostics::option_id opt_id) return global_dc->option_unspecified_p (opt_id); } -extern char *get_cwe_url (int cwe); - namespace diagnostics { -const char *maybe_line_and_column (int line, int col); +/* Compute the number of digits in the decimal representation of an integer. */ +extern int num_digits (int); + +extern char *get_cwe_url (int cwe); +extern const char *maybe_line_and_column (int line, int col); } // namespace diagnostics diff --git a/gcc/diagnostic.cc b/gcc/diagnostics/context.cc similarity index 90% rename from gcc/diagnostic.cc rename to gcc/diagnostics/context.cc index 5e2cb0e4d67a..f91f13f5d7df 100644 --- a/gcc/diagnostic.cc +++ b/gcc/diagnostics/context.cc @@ -126,10 +126,12 @@ diagnostic_set_caret_max_width (diagnostics::context *context, int value) context->m_source_printing.max_width = value; } +namespace diagnostics { + /* Initialize the diagnostic message outputting machinery. */ void -diagnostics::context::initialize (int n_opts) +context::initialize (int n_opts) { /* Allocate a basic pretty-printer. Clients will replace this a much more elaborated pretty-printer if they wish. */ @@ -160,12 +162,12 @@ diagnostics::context::initialize (int n_opts) m_max_errors = 0; m_internal_error = nullptr; m_adjust_diagnostic_info = nullptr; - m_text_callbacks.m_begin_diagnostic = diagnostics::default_text_starter; + m_text_callbacks.m_begin_diagnostic = default_text_starter; m_text_callbacks.m_text_start_span - = diagnostics::default_start_span_fn<to_text>; + = default_start_span_fn<to_text>; m_text_callbacks.m_html_start_span - = diagnostics::default_start_span_fn<to_html>; - m_text_callbacks.m_end_diagnostic = diagnostics::default_text_finalizer; + = default_start_span_fn<to_html>; + m_text_callbacks.m_end_diagnostic = default_text_finalizer; m_option_mgr = nullptr; m_urlifier_stack = new auto_vec<urlifier_stack_node> (); m_last_location = UNKNOWN_LOCATION; @@ -197,7 +199,7 @@ diagnostics::context::initialize (int n_opts) m_diagnostic_groups.m_diagnostic_nesting_level = 0; m_diagnostic_groups.m_emission_count = 0; m_diagnostic_groups.m_inhibiting_notes_from = 0; - m_sinks.safe_push (new diagnostics::text_sink (*this, nullptr, true)); + m_sinks.safe_push (new text_sink (*this, nullptr, true)); m_set_locations_cb = nullptr; m_client_data_hooks = nullptr; m_diagrams.m_theme = nullptr; @@ -221,7 +223,7 @@ diagnostics::context::initialize (int n_opts) without a VALUE, it initializes with DIAGNOSTICS_COLOR_DEFAULT. */ void -diagnostics::context::color_init (int value) +context::color_init (int value) { /* value == -1 is the default value. */ if (value < 0) @@ -252,7 +254,7 @@ diagnostics::context::color_init (int value) handling "auto". */ void -diagnostics::context::urls_init (int value) +context::urls_init (int value) { /* value == -1 is the default value. */ if (value < 0) @@ -283,9 +285,8 @@ diagnostics::context::urls_init (int value) /* Create the file_cache, if not already created, and tell it how to translate files on input. */ void -diagnostics::context:: -initialize_input_context (diagnostic_input_charset_callback ccb, - bool should_skip_bom) +context::initialize_input_context (diagnostic_input_charset_callback ccb, + bool should_skip_bom) { m_file_cache->initialize_input_context (ccb, should_skip_bom); } @@ -293,7 +294,7 @@ initialize_input_context (diagnostic_input_charset_callback ccb, /* Do any cleaning up required after the last diagnostic is emitted. */ void -diagnostics::context::finish () +context::finish () { /* We might be handling a fatal error. Close any active diagnostic groups, which may trigger flushing @@ -352,7 +353,7 @@ diagnostics::context::finish () /* Dump state of this diagnostics::context to OUT, for debugging. */ void -diagnostics::context::dump (FILE *out) const +context::dump (FILE *out) const { fprintf (out, "diagnostics::context:\n"); m_diagnostic_counters.dump (out, 2); @@ -385,7 +386,7 @@ diagnostics::context::dump (FILE *out) const we ought to exit with a non-zero exit code. */ bool -diagnostics::context::execution_failed_p () const +context::execution_failed_p () const { /* Equivalent to (seen_error () || werrorcount), but on this context, rather than global_dc. */ @@ -395,21 +396,21 @@ diagnostics::context::execution_failed_p () const } void -diagnostics::context::remove_all_output_sinks () +context::remove_all_output_sinks () { while (!m_sinks.is_empty ()) delete m_sinks.pop (); } void -diagnostics::context::set_sink (std::unique_ptr<diagnostics::sink> sink_) +context::set_sink (std::unique_ptr<sink> sink_) { remove_all_output_sinks (); m_sinks.safe_push (sink_.release ()); } -diagnostics::sink & -diagnostics::context::get_sink (size_t idx) const +sink & +context::get_sink (size_t idx) const { gcc_assert (idx < m_sinks.length ()); gcc_assert (m_sinks[idx]); @@ -417,7 +418,7 @@ diagnostics::context::get_sink (size_t idx) const } void -diagnostics::context::add_sink (std::unique_ptr<diagnostics::sink> sink_) +context::add_sink (std::unique_ptr<sink> sink_) { m_sinks.safe_push (sink_.release ()); } @@ -425,7 +426,7 @@ diagnostics::context::add_sink (std::unique_ptr<diagnostics::sink> sink_) /* Return true if there are no machine-readable formats writing to stderr. */ bool -diagnostics::context::supports_fnotice_on_stderr_p () const +context::supports_fnotice_on_stderr_p () const { for (auto sink_ : m_sinks) if (sink_->machine_readable_stderr_p ()) @@ -434,15 +435,14 @@ diagnostics::context::supports_fnotice_on_stderr_p () const } void -diagnostics::context::set_main_input_filename (const char *filename) +context::set_main_input_filename (const char *filename) { for (auto sink_ : m_sinks) sink_->set_main_input_filename (filename); } void -diagnostics::context:: -set_client_data_hooks (std::unique_ptr<diagnostics::client_data_hooks> hooks) +context::set_client_data_hooks (std::unique_ptr<client_data_hooks> hooks) { delete m_client_data_hooks; /* Ideally the field would be a std::unique_ptr here. */ @@ -450,7 +450,7 @@ set_client_data_hooks (std::unique_ptr<diagnostics::client_data_hooks> hooks) } void -diagnostics::context::set_original_argv (unique_argv original_argv) +context::set_original_argv (unique_argv original_argv) { /* Ideally we'd use a unique_argv for m_original_argv, but diagnostics::context doesn't yet have a ctor/dtor pair. */ @@ -463,9 +463,8 @@ diagnostics::context::set_original_argv (unique_argv original_argv) } void -diagnostics::context:: -set_option_manager (std::unique_ptr<diagnostics::option_manager> mgr, - unsigned lang_mask) +context::set_option_manager (std::unique_ptr<option_manager> mgr, + unsigned lang_mask) { delete m_option_mgr; m_option_mgr = mgr.release (); @@ -473,7 +472,7 @@ set_option_manager (std::unique_ptr<diagnostics::option_manager> mgr, } void -diagnostics::context::push_owned_urlifier (std::unique_ptr<urlifier> ptr) +context::push_owned_urlifier (std::unique_ptr<urlifier> ptr) { gcc_assert (m_urlifier_stack); const urlifier_stack_node node = { ptr.release (), true }; @@ -481,7 +480,7 @@ diagnostics::context::push_owned_urlifier (std::unique_ptr<urlifier> ptr) } void -diagnostics::context::push_borrowed_urlifier (const urlifier &loan) +context::push_borrowed_urlifier (const urlifier &loan) { gcc_assert (m_urlifier_stack); const urlifier_stack_node node = { const_cast <urlifier *> (&loan), false }; @@ -489,7 +488,7 @@ diagnostics::context::push_borrowed_urlifier (const urlifier &loan) } void -diagnostics::context::pop_urlifier () +context::pop_urlifier () { gcc_assert (m_urlifier_stack); gcc_assert (m_urlifier_stack->length () > 0); @@ -499,8 +498,8 @@ diagnostics::context::pop_urlifier () delete node.m_urlifier; } -const diagnostics::logical_locations::manager * -diagnostics::context::get_logical_location_manager () const +const logical_locations::manager * +context::get_logical_location_manager () const { if (!m_client_data_hooks) return nullptr; @@ -508,7 +507,7 @@ diagnostics::context::get_logical_location_manager () const } const urlifier * -diagnostics::context::get_urlifier () const +context::get_urlifier () const { if (!m_urlifier_stack) return nullptr; @@ -522,7 +521,7 @@ diagnostics::context::get_urlifier () const Refresh all output sinks. */ void -diagnostics::context::set_pretty_printer (std::unique_ptr<pretty_printer> pp) +context::set_pretty_printer (std::unique_ptr<pretty_printer> pp) { delete m_reference_printer; m_reference_printer = pp.release (); @@ -532,7 +531,7 @@ diagnostics::context::set_pretty_printer (std::unique_ptr<pretty_printer> pp) /* Give all output sinks a chance to rebuild their pretty_printer. */ void -diagnostics::context::refresh_output_sinks () +context::refresh_output_sinks () { for (auto sink_ : m_sinks) sink_->update_printer (); @@ -542,7 +541,7 @@ diagnostics::context::refresh_output_sinks () of all output sinks. */ void -diagnostics::context::set_format_decoder (printer_fn format_decoder) +context::set_format_decoder (printer_fn format_decoder) { pp_format_decoder (m_reference_printer) = format_decoder; for (auto sink_ : m_sinks) @@ -550,7 +549,7 @@ diagnostics::context::set_format_decoder (printer_fn format_decoder) } void -diagnostics::context::set_show_highlight_colors (bool val) +context::set_show_highlight_colors (bool val) { pp_show_highlight_colors (m_reference_printer) = val; for (auto sink_ : m_sinks) @@ -559,7 +558,7 @@ diagnostics::context::set_show_highlight_colors (bool val) } void -diagnostics::context::set_prefixing_rule (diagnostic_prefixing_rule_t rule) +context::set_prefixing_rule (diagnostic_prefixing_rule_t rule) { pp_prefixing_rule (m_reference_printer) = rule; for (auto sink_ : m_sinks) @@ -568,13 +567,15 @@ diagnostics::context::set_prefixing_rule (diagnostic_prefixing_rule_t rule) } void -diagnostics::context::initialize_fixits_change_set () +context::initialize_fixits_change_set () { delete m_fixits_change_set; gcc_assert (m_file_cache); - m_fixits_change_set = new diagnostics::changes::change_set (*m_file_cache); + m_fixits_change_set = new changes::change_set (*m_file_cache); } +} // namespace diagnostics + /* Initialize DIAGNOSTIC, where the message MSG has already been translated. */ void @@ -637,8 +638,6 @@ get_color_for_kind (enum kind kind) return diagnostic_kind_color[static_cast<int> (kind)]; } -} // namespace diagnostics - /* Given an expanded_location, convert the column (which is in 1-based bytes) to the requested units, without converting the origin. Return -1 if the column is invalid (<= 0). */ @@ -668,7 +667,7 @@ convert_column_unit (file_cache &fc, } } -diagnostics::column_policy::column_policy (const diagnostics::context &dc) +column_policy::column_policy (const context &dc) : m_file_cache (dc.get_file_cache ()), m_column_unit (dc.m_column_unit), m_column_origin (dc.m_column_origin), @@ -680,7 +679,7 @@ diagnostics::column_policy::column_policy (const diagnostics::context &dc) to the requested units and origin. Return -1 if the column is invalid (<= 0). */ int -diagnostics::column_policy::converted_column (expanded_location s) const +column_policy::converted_column (expanded_location s) const { int one_based_col = convert_column_unit (m_file_cache, m_column_unit, m_tabstop, s); @@ -692,9 +691,9 @@ diagnostics::column_policy::converted_column (expanded_location s) const /* Return a string describing a location e.g. "foo.c:42:10". */ label_text -diagnostics::column_policy::get_location_text (const expanded_location &s, - bool show_column, - bool colorize) const +column_policy::get_location_text (const expanded_location &s, + bool show_column, + bool colorize) const { const char *locus_cs = colorize_start (colorize, "locus"); const char *locus_ce = colorize_stop (colorize); @@ -708,26 +707,28 @@ diagnostics::column_policy::get_location_text (const expanded_location &s, col = converted_column (s); } - const char *line_col = diagnostics::maybe_line_and_column (line, col); + const char *line_col = maybe_line_and_column (line, col); return label_text::take (build_message_string ("%s%s%s:%s", locus_cs, file, line_col, locus_ce)); } -diagnostics::location_print_policy:: -location_print_policy (const diagnostics::context &dc) +location_print_policy:: +location_print_policy (const context &dc) : m_column_policy (dc), m_show_column (dc.m_show_column) { } -diagnostics::location_print_policy:: -location_print_policy (const diagnostics::text_sink &text_output) +location_print_policy:: +location_print_policy (const text_sink &text_output) : m_column_policy (text_output.get_context ()), m_show_column (text_output.get_context ().m_show_column) { } +} // namespace diagnostics + /* Functions at which to stop the backtrace print. It's not particularly helpful to print the callers of these functions. */ @@ -752,10 +753,10 @@ bt_callback (void *data, uintptr_t pc, const char *filename, int lineno, if (filename == nullptr && function == nullptr) return 0; - /* Skip functions in diagnostic.cc. */ + /* Skip functions in context.cc. */ if (*pcount == 0 && filename != nullptr - && strcmp (lbasename (filename), "diagnostic.cc") == 0) + && strcmp (lbasename (filename), "context.cc") == 0) return 0; /* Print up to 20 functions. We could make this a --param, but @@ -821,12 +822,14 @@ bt_err_callback (void *data ATTRIBUTE_UNUSED, const char *msg, int errnum) errnum == 0 ? "" : xstrerror (errnum)); } +namespace diagnostics { + /* Check if we've met the maximum error limit, and if so fatally exit with a message. FLUSH indicates whether a diagnostics::context::finish call is needed. */ void -diagnostics::context::check_max_errors (bool flush) +context::check_max_errors (bool flush) { if (!m_max_errors) return; @@ -850,7 +853,7 @@ diagnostics::context::check_max_errors (bool flush) is written out. This function does not always return. */ void -diagnostics::context::action_after_output (enum kind diag_kind) +context::action_after_output (enum kind diag_kind) { switch (diag_kind) { @@ -927,7 +930,7 @@ diagnostics::context::action_after_output (enum kind diag_kind) its future children if any. */ void -diagnostics::context::inhibit_notes_in_group (bool inhibit) +context::inhibit_notes_in_group (bool inhibit) { int curr_depth = (m_diagnostic_groups.m_group_nesting_depth + m_diagnostic_groups.m_diagnostic_nesting_level); @@ -957,7 +960,7 @@ diagnostics::context::inhibit_notes_in_group (bool inhibit) /* Return whether notes must be inhibited in the current diagnostic_group. */ bool -diagnostics::context::notes_inhibited_in_group () const +context::notes_inhibited_in_group () const { if (m_diagnostic_groups.m_inhibiting_notes_from && (m_diagnostic_groups.m_group_nesting_depth @@ -972,7 +975,7 @@ diagnostics::context::notes_inhibited_in_group () const /* Return true iff this is a function or method. */ bool -diagnostics::logical_locations::manager::function_p (key k) const +logical_locations::manager::function_p (key k) const { switch (get_kind (k)) { @@ -1083,7 +1086,7 @@ print_parseable_fixits (file_cache &fc, /* Update the inlining info in this context for a DIAGNOSTIC. */ void -diagnostics::context::get_any_inlining_info (diagnostic_info *diagnostic) +context::get_any_inlining_info (diagnostic_info *diagnostic) { auto &ilocs = diagnostic->m_iinfo.m_ilocs; @@ -1115,7 +1118,7 @@ get_cwe_url (int cwe) as appropriate for #pragma GCC diagnostic and -Werror=foo. */ bool -diagnostics::context::diagnostic_enabled (diagnostic_info *diagnostic) +context::diagnostic_enabled (diagnostic_info *diagnostic) { /* Update the inlining stack for this diagnostic. */ get_any_inlining_info (diagnostic); @@ -1159,8 +1162,8 @@ diagnostics::context::diagnostic_enabled (diagnostic_info *diagnostic) /* Returns whether warning OPT_ID is enabled at LOC. */ bool -diagnostics::context::warning_enabled_at (location_t loc, - diagnostics::option_id opt_id) +context::warning_enabled_at (location_t loc, + option_id opt_id) { if (!diagnostic_report_warnings_p (this, loc)) return false; @@ -1177,12 +1180,11 @@ diagnostics::context::warning_enabled_at (location_t loc, /* Emit a diagnostic within a diagnostic group on this context. */ bool -diagnostics::context:: -emit_diagnostic_with_group (enum kind kind, - rich_location &richloc, - const diagnostics::metadata *metadata, - diagnostics::option_id opt_id, - const char *gmsgid, ...) +context::emit_diagnostic_with_group (enum kind kind, + rich_location &richloc, + const metadata *metadata, + option_id opt_id, + const char *gmsgid, ...) { begin_group (); @@ -1200,12 +1202,11 @@ emit_diagnostic_with_group (enum kind kind, /* As above, but taking a va_list *. */ bool -diagnostics::context:: -emit_diagnostic_with_group_va (enum kind kind, - rich_location &richloc, - const diagnostics::metadata *metadata, - diagnostics::option_id opt_id, - const char *gmsgid, va_list *ap) +context::emit_diagnostic_with_group_va (enum kind kind, + rich_location &richloc, + const metadata *metadata, + option_id opt_id, + const char *gmsgid, va_list *ap) { begin_group (); @@ -1224,7 +1225,7 @@ emit_diagnostic_with_group_va (enum kind kind, Return true if a diagnostic was printed, false otherwise. */ bool -diagnostics::context::report_diagnostic (diagnostic_info *diagnostic) +context::report_diagnostic (diagnostic_info *diagnostic) { enum kind orig_diag_kind = diagnostic->m_kind; @@ -1420,7 +1421,7 @@ diagnostics::context::report_diagnostic (diagnostic_info *diagnostic) } void -diagnostics::context::report_verbatim (text_info &text) +context::report_verbatim (text_info &text) { va_list *orig_args = text.m_args_ptr; for (auto sink_ : m_sinks) @@ -1434,8 +1435,7 @@ diagnostics::context::report_verbatim (text_info &text) } void -diagnostics::context:: -report_global_digraph (const diagnostics::digraphs::lazy_digraph &ldg) +context::report_global_digraph (const digraphs::lazy_digraph &ldg) { for (auto sink_ : m_sinks) sink_->report_global_digraph (ldg); @@ -1462,6 +1462,8 @@ num_digits (int value) return digits; } +} // namespace diagnostics + /* Given a partial pathname as input, return another pathname that shares no directory elements with the pathname of __FILE__. This is used by fancy_abort() to print `internal compiler error in expr.cc' @@ -1492,15 +1494,17 @@ trim_filename (const char *name) return p; } +namespace diagnostics { + /* Implement emit_diagnostic, inform, warning, warning_at, pedwarn, permerror, error, error_at, error_at, sorry, fatal_error, internal_error, and internal_error_no_backtrace, as documented and defined below. */ bool -diagnostics::context::diagnostic_impl (rich_location *richloc, - const diagnostics::metadata *metadata, - diagnostics::option_id opt_id, - const char *gmsgid, - va_list *ap, enum kind kind) +context::diagnostic_impl (rich_location *richloc, + const metadata *metadata, + option_id opt_id, + const char *gmsgid, + va_list *ap, enum kind kind) { diagnostic_info diagnostic; if (kind == kind::permerror) @@ -1522,13 +1526,13 @@ diagnostics::context::diagnostic_impl (rich_location *richloc, /* Implement inform_n, warning_n, and error_n, as documented and defined below. */ bool -diagnostics::context::diagnostic_n_impl (rich_location *richloc, - const diagnostics::metadata *metadata, - diagnostics::option_id opt_id, - unsigned HOST_WIDE_INT n, - const char *singular_gmsgid, - const char *plural_gmsgid, - va_list *ap, enum kind kind) +context::diagnostic_n_impl (rich_location *richloc, + const metadata *metadata, + option_id opt_id, + unsigned HOST_WIDE_INT n, + const char *singular_gmsgid, + const char *plural_gmsgid, + va_list *ap, enum kind kind) { diagnostic_info diagnostic; unsigned long gtn; @@ -1553,7 +1557,7 @@ diagnostics::context::diagnostic_n_impl (rich_location *richloc, /* Emit DIAGRAM to this context, respecting the output format. */ void -diagnostics::context::emit_diagram (const diagnostics::diagram &diag) +context::emit_diagram (const diagram &diag) { if (m_diagrams.m_theme == nullptr) return; @@ -1568,7 +1572,7 @@ diagnostics::context::emit_diagram (const diagnostics::diagram &diag) This mustn't use internal_error, that will cause infinite recursion. */ void -diagnostics::context::error_recursion () +context::error_recursion () { if (m_lock < 3) pp_newline_and_flush (m_reference_printer); @@ -1585,6 +1589,8 @@ diagnostics::context::error_recursion () real_abort (); } +} // namespace diagnostics + /* Report an internal compiler error in a friendly manner. This is the function that gets called upon use of abort() in the source code generally, thanks to a special macro. */ @@ -1627,16 +1633,18 @@ fancy_abort (const char *file, int line, const char *function) internal_error ("in %s, at %s:%d", function, trim_filename (file), line); } +namespace diagnostics { + /* class diagnostics::context. */ void -diagnostics::context::begin_group () +context::begin_group () { m_diagnostic_groups.m_group_nesting_depth++; } void -diagnostics::context::end_group () +context::end_group () { if (--m_diagnostic_groups.m_group_nesting_depth == 0) { @@ -1653,13 +1661,13 @@ diagnostics::context::end_group () } void -diagnostics::context::push_nesting_level () +context::push_nesting_level () { ++m_diagnostic_groups.m_diagnostic_nesting_level; } void -diagnostics::context::pop_nesting_level () +context::pop_nesting_level () { --m_diagnostic_groups.m_diagnostic_nesting_level; /* We're popping one level, so might need to stop inhibiting notes. */ @@ -1667,29 +1675,29 @@ diagnostics::context::pop_nesting_level () } void -diagnostics::sink::dump (FILE *out, int indent) const +sink::dump (FILE *out, int indent) const { fprintf (out, "%*sprinter:\n", indent, ""); m_printer->dump (out, indent + 2); } void -diagnostics::sink::on_report_verbatim (text_info &) +sink::on_report_verbatim (text_info &) { /* No-op. */ } -/* Set the output format for CONTEXT to FORMAT, using BASE_FILE_NAME for +/* Set the output format for DC to FORMAT, using BASE_FILE_NAME for file-based output formats. */ void -diagnostics::output_format_init (diagnostics::context &context, - const char *main_input_filename_, - const char *base_file_name, - enum diagnostics_output_format format, - bool json_formatting) +output_format_init (context &dc, + const char *main_input_filename_, + const char *base_file_name, + enum diagnostics_output_format format, + bool json_formatting) { - diagnostics::sink *new_sink = nullptr; + sink *new_sink = nullptr; switch (format) { default: @@ -1699,16 +1707,16 @@ diagnostics::output_format_init (diagnostics::context &context, break; case DIAGNOSTICS_OUTPUT_FORMAT_SARIF_STDERR: - new_sink = &diagnostics::init_sarif_stderr (context, - line_table, - json_formatting); + new_sink = &init_sarif_stderr (dc, + line_table, + json_formatting); break; case DIAGNOSTICS_OUTPUT_FORMAT_SARIF_FILE: - new_sink = &diagnostics::init_sarif_file (context, - line_table, - json_formatting, - base_file_name); + new_sink = &init_sarif_file (dc, + line_table, + json_formatting, + base_file_name); break; } if (new_sink) @@ -1720,8 +1728,7 @@ diagnostics::output_format_init (diagnostics::context &context, (or nullptr for "no diagrams"). */ void -diagnostics::context:: -set_text_art_charset (enum diagnostic_text_art_charset charset) +context::set_text_art_charset (enum diagnostic_text_art_charset charset) { delete m_diagrams.m_theme; switch (charset) @@ -1749,13 +1756,13 @@ set_text_art_charset (enum diagnostic_text_art_charset charset) /* struct diagnostics::counters. */ -diagnostics::counters::counters () +counters::counters () { clear (); } void -diagnostics::counters::dump (FILE *out, int indent) const +counters::dump (FILE *out, int indent) const { fprintf (out, "%*scounts:\n", indent, ""); bool none = true; @@ -1773,7 +1780,7 @@ diagnostics::counters::dump (FILE *out, int indent) const } void -diagnostics::counters::move_to (diagnostics::counters &dest) +counters::move_to (counters &dest) { for (int i = 0; i < static_cast<int> (kind::last_diagnostic_kind); i++) dest.m_count_for_kind[i] += m_count_for_kind[i]; @@ -1781,29 +1788,23 @@ diagnostics::counters::move_to (diagnostics::counters &dest) } void -diagnostics::counters::clear () +counters::clear () { memset (&m_count_for_kind, 0, sizeof m_count_for_kind); } -/* Really call the system 'abort'. This has to go right at the end of - this file, so that there are no functions after it that call abort - and get the system abort instead of our macro. */ -#undef abort -static void -real_abort (void) -{ - abort (); -} - #if CHECKING_P namespace selftest { +using line_table_test = ::selftest::line_table_test; +using temp_source_file = ::selftest::temp_source_file; + /* Helper function for test_print_escaped_string. */ static void -assert_print_escaped_string (const location &loc, const char *expected_output, +assert_print_escaped_string (const ::selftest::location &loc, + const char *expected_output, const char *input) { pretty_printer pp; @@ -2102,10 +2103,14 @@ test_num_digits () ASSERT_EQ (8, num_digits (99999999)); } -/* Run all of the selftests within this file. */ +/* Run all of the selftests within this file. + + According to https://gcc.gnu.org/pipermail/gcc/2021-November/237703.html + there are some language-specific assumptions within these tests, so only + run them from C/C++. */ void -c_diagnostic_cc_tests () +context_cc_tests () { test_print_escaped_string (); test_print_parseable_fixits_none (); @@ -2117,10 +2122,23 @@ c_diagnostic_cc_tests () test_num_digits (); } -} // namespace selftest +} // namespace diagnostics::selftest +} // namespace diagnostics #endif /* #if CHECKING_P */ #if __GNUC__ >= 10 # pragma GCC diagnostic pop #endif + +static void real_abort (void) ATTRIBUTE_NORETURN; + +/* Really call the system 'abort'. This has to go right at the end of + this file, so that there are no functions after it that call abort + and get the system abort instead of our macro. */ +#undef abort +static void +real_abort (void) +{ + abort (); +} diff --git a/gcc/diagnostics/diagnostics-selftests.cc b/gcc/diagnostics/diagnostics-selftests.cc index 6bb268ba1147..b6fcf08aac1c 100644 --- a/gcc/diagnostics/diagnostics-selftests.cc +++ b/gcc/diagnostics/diagnostics-selftests.cc @@ -30,7 +30,11 @@ namespace diagnostics { namespace selftest { -/* Run all diagnostics-specific selftests. */ +/* Run all diagnostics-specific selftests, + apart from context_cc_tests, which according to + https://gcc.gnu.org/pipermail/gcc/2021-November/237703.html + has some language-specific assumptions, and thus is run from + c_family_tests instead. */ void run_diagnostics_selftests () diff --git a/gcc/diagnostics/diagnostics-selftests.h b/gcc/diagnostics/diagnostics-selftests.h index 200b5c644677..501814d8ffb2 100644 --- a/gcc/diagnostics/diagnostics-selftests.h +++ b/gcc/diagnostics/diagnostics-selftests.h @@ -34,6 +34,7 @@ extern void run_diagnostics_selftests (); extern void changes_cc_tests (); extern void color_cc_tests (); +extern void context_cc_tests (); extern void digraphs_cc_tests (); extern void html_sink_cc_tests (); extern void lazy_paths_cc_tests (); diff --git a/gcc/diagnostics/sarif-sink.cc b/gcc/diagnostics/sarif-sink.cc index 451ed5990eee..592a690ee9a4 100644 --- a/gcc/diagnostics/sarif-sink.cc +++ b/gcc/diagnostics/sarif-sink.cc @@ -1736,10 +1736,10 @@ bt_callback (void *data, uintptr_t pc, const char *filename, int lineno, if (filename == nullptr && function == nullptr) return 0; - /* Skip functions in diagnostic.cc or diagnostic-global-context.cc. */ + /* Skip functions in context.cc or diagnostic-global-context.cc. */ if (closure->m_frames_arr->size () == 0 && filename != nullptr - && (strcmp (lbasename (filename), "diagnostic.cc") == 0 + && (strcmp (lbasename (filename), "context.cc") == 0 || strcmp (lbasename (filename), "diagnostic-global-context.cc") == 0)) return 0; diff --git a/gcc/diagnostics/source-printing.cc b/gcc/diagnostics/source-printing.cc index 8555ae41fb77..a2d6bd728ee1 100644 --- a/gcc/diagnostics/source-printing.cc +++ b/gcc/diagnostics/source-printing.cc @@ -2176,7 +2176,7 @@ layout::calculate_linenum_width () int highest_line = last_span->m_last_line; if (highest_line < 0) highest_line = 0; - m_linenum_width = num_digits (highest_line); + m_linenum_width = diagnostics::num_digits (highest_line); /* If we're showing jumps in the line-numbering, allow at least 3 chars. */ if (m_line_spans.length () > 1) m_linenum_width = MAX (m_linenum_width, 3); @@ -2283,7 +2283,7 @@ layout_printer<Sink>::print_source_line (linenum_type row, if (m_layout.m_options.show_line_numbers_p) { m_sink.push_html_tag_with_class ("td", "linenum", true); - int width = num_digits (row); + int width = diagnostics::num_digits (row); for (int i = 0; i < m_layout.get_linenum_width () - width; i++) m_sink.add_space (); char buf[20]; diff --git a/gcc/errors.cc b/gcc/errors.cc index 6d1ecc7dd7ed..fb6b19d3d636 100644 --- a/gcc/errors.cc +++ b/gcc/errors.cc @@ -19,7 +19,8 @@ along with GCC; see the file COPYING3. If not see /* warning, error, and fatal. These definitions are suitable for use in the generator programs; the compiler has a more elaborate suite - of diagnostic printers, found in diagnostic.cc. */ + of diagnostic printers, found in diagnostic-global-context.cc using + the diagnostics/ subdirectory. */ #ifdef HOST_GENERATOR_FILE #include "config.h" @@ -126,7 +127,7 @@ trim_filename (const char *name) /* "Fancy" abort. Reports where in the compiler someone gave up. This file is used only by build programs, so we're not as polite as - the version in diagnostic.cc. */ + the version in diagnostics/context.cc. */ void fancy_abort (const char *file, int line, const char *func) { diff --git a/gcc/input.cc b/gcc/input.cc index fabfbfb6eaae..afd74f6a25f2 100644 --- a/gcc/input.cc +++ b/gcc/input.cc @@ -1524,10 +1524,10 @@ dump_location_info (FILE *stream) if (max_col > line_text.length ()) max_col = line_text.length () + 1; - int len_lnum = num_digits (exploc.line); + int len_lnum = diagnostics::num_digits (exploc.line); if (len_lnum < 3) len_lnum = 3; - int len_loc = num_digits (loc); + int len_loc = diagnostics::num_digits (loc); if (len_loc < 5) len_loc = 5; diff --git a/libcpp/charset.cc b/libcpp/charset.cc index e3accf8e9a58..95ba376606ed 100644 --- a/libcpp/charset.cc +++ b/libcpp/charset.cc @@ -2420,7 +2420,7 @@ convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit, { encoding_rich_location rich_loc (pfile); - /* diagnostic.cc does not support "%03o". When it does, this + /* pretty-print.cc does not support "%03o". When it does, this code can use %03o directly in the diagnostic again. */ char buf[32]; sprintf(buf, "%03o", (int) c); -- 2.26.3