Previously, source_location/location_t values passed to rich_location were immediately expanded (to expanded_location instances stored inside the rich_location).
This patch updates the insides of class rich_location to delay this expansion until the insides of diagnostic_show_locus. This simplifies the implementation, and allows for future fixes to the printing code for handling PR c/68473 where we could do something smarter about printing ranges within macro expansions (since it gives us access to the relevant virtual locs from within diagnostic_show_locus). That idea isn't implemented in this patch kit though; it merely has a patch for the PR to gracefully degrade the diagnostic to showing a caret without ranges. Delaying the expansion means that rich_location's ctor no longer needs access to the line_table, so this param is dropped. The change in internal representation means that it's simplest to drop support for constructing rich_location instances from source_range values: this was only used in plugins in the testsuite, so I've updated those accordingly. With the delayed expansion, source_range::debug becomes impossible to implement without having it make a new location_t. I've found that I'm no longer using this debug function, so I've dropped it - these days I generally debug this stuff by injecting calls to "inform" from within gdb. gcc/c-family/ChangeLog: * c-common.c (c_cpp_error): Remove line_table param from call to rich_location::set_range. gcc/c/ChangeLog: * c-decl.c (warn_defaults_to): Remove line_table param from call to rich_location ctor. * c-errors.c (pedwarn_c99): Likewise. (pedwarn_c90): Likewise. * c-typeck.c (build_component_ref): Likewise. gcc/cp/ChangeLog: * error.c (pedwarn_cxx98): Remove line_table param from call to rich_location ctor. gcc/ChangeLog: * diagnostic-show-locus.c (layout_range::layout_range): Replace location_range param with three const expanded_locations * and a bool. (layout::layout): Replace call to rich_location::lazily_expand_location with get_expanded_location. Make loc_range const. Extract the range and perform location expansion here, passing the results to the layout_range ctor. * diagnostic.c (diagnostic_append_note): Remove line_table param from call to rich_location ctor. (emit_diagnostic): Likewise. (inform): Likewise. (inform_n): Likewise. (warning): Likewise. (warning_at): Likewise. (warning_n): Likewise. (pedwarn): Likewise. (permerror): Likewise. (error): Likewise. (error_n): Likewise. (error_at): Likewise. (sorry): Likewise. (fatal_error): Likewise. (internal_error): Likewise. (internal_error_no_backtrace): Likewise. (source_range::debug): Delete. * diagnostic.h (diagnostic_expand_location): Reimplement in terms of rich_location::get_expanded_location. gcc/fortran/ChangeLog: * error.c (gfc_warning): Remove line_table param from call to rich_location ctor. (gfc_warning_now_at): Likewise. (gfc_warning_now): Likewise. (gfc_error_now): Likewise. (gfc_fatal_error): Likewise. (gfc_error): Likewise. (gfc_internal_error): Likewise. gcc/ChangeLog: * gcc-rich-location.c (get_range_for_expr): Delete. (gcc_rich_location::add_expr): Reimplement to avoid the rich_location::add_range overload that took a location_range, passing a location_t instead. * gcc-rich-location.h (gcc_rich_location::gcc_rich_location): Eliminate the overloaded ctor taking a source_range. Remove line_table param from call to rich_location ctor. * genmatch.c (fatal_at): Remove line_table param from call to rich_location ctor. (fatal_at): Likewise. (warning_at): Likewise. * pretty-print.c (text_info::set_location): Likewise for call to rich_location::set_range. * rtl-error.c (diagnostic_for_asm): Likewise for call to rich_location ctor. gcc/testsuite/ChangeLog: * gcc.dg/plugin/diagnostic_plugin_show_trees.c (get_range_for_expr): Delete, as per gcc-rich-location.c (gcc_rich_location::add_expr): Update as per gcc-rich-location.c. (show_tree): Drop range information from call to inform_at_rich_loc. * gcc.dg/plugin/diagnostic_plugin_test_show_locus.c (add_range): New. (test_show_locus): Replace calls to rich_location::add_range with calls to add_range. Rewrite the tests that used the now-defunct rich_location ctor taking a source_range. Simplify other tests by replacing calls to COMBINE_LOCATION_DATA with calls to make_location. libcpp/ChangeLog: * errors.c (cpp_diagnostic): Remove line_table param from call to rich_location ctor. (cpp_diagnostic_with_line): Likewise. * include/line-map.h (source_range::debug): Delete. (struct location_range): Update comment. Replace expanded_location fields "m_start", "m_finish", and "m_caret" with a source_location field: "m_loc". (class rich_location): Reword comment. (rich_location::rich_location): Drop line_maps * param from ctor; delete ctor taking a source_range. (rich_location::get_loc): Reimplement in terms of a new overloaded variant which takes an unsigned int. (rich_location::get_loc_addr): Delete. (rich_location::add_range): Drop params "start" and "finish" in favor of param "loc". Drop overloaded variants taking a source_range or location_range *. (rich_location::set_range): Drop line_maps * param. (rich_location::lazily_expand_location): Delete in favor of... (rich_location::get_expanded_location): New decl. (rich_location::m_loc): Delete field. (rich_location::m_column_override): New field. * line-map.c (rich_location::rich_location): Drop line_maps * param, initialization of deleted fields. Reimplement body as a call to add_range. Delete overloaded variant taking a source_range. (rich_location::get_loc): New function. (rich_location::lazily_expand_location): Delete in favor of... (rich_location::get_expanded_location): New function. (rich_location::override_column): Reimplement. (rich_location::add_range): Drop params "start" and "finish" in favor of param "loc". Eliminate location expansion in favor of simply storing loc. Drop overloaded variants taking a source_range or location_range *. (rich_location::set_range): Drop line_maps * param. Eliminate location expansion. --- gcc/c-family/c-common.c | 2 +- gcc/c/c-decl.c | 2 +- gcc/c/c-errors.c | 4 +- gcc/c/c-typeck.c | 2 +- gcc/cp/error.c | 2 +- gcc/diagnostic-show-locus.c | 49 ++++++--- gcc/diagnostic.c | 46 +++------ gcc/diagnostic.h | 2 +- gcc/fortran/error.c | 14 +-- gcc/gcc-rich-location.c | 28 +----- gcc/gcc-rich-location.h | 11 +-- gcc/genmatch.c | 8 +- gcc/pretty-print.c | 2 +- gcc/rtl-error.c | 2 +- .../gcc.dg/plugin/diagnostic_plugin_show_trees.c | 33 +------ .../plugin/diagnostic_plugin_test_show_locus.c | 109 ++++++++++----------- libcpp/errors.c | 4 +- libcpp/include/line-map.h | 63 ++++-------- libcpp/line-map.c | 109 ++++++++------------- 19 files changed, 186 insertions(+), 306 deletions(-) diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 9bc02fc..509a0ca 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -10161,7 +10161,7 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason, gcc_unreachable (); } if (done_lexing) - richloc->set_range (line_table, 0, input_location, true); + richloc->set_range (0, input_location, true); diagnostic_set_info_translated (&diagnostic, msg, ap, richloc, dlevel); diagnostic_override_option_index (&diagnostic, diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index adac2b6..2d56f34 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -5320,7 +5320,7 @@ warn_defaults_to (location_t location, int opt, const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, diff --git a/gcc/c/c-errors.c b/gcc/c/c-errors.c index ee9c2b5..ef0f9a2 100644 --- a/gcc/c/c-errors.c +++ b/gcc/c/c-errors.c @@ -37,7 +37,7 @@ pedwarn_c99 (location_t location, int opt, const char *gmsgid, ...) diagnostic_info diagnostic; va_list ap; bool warned = false; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); /* If desired, issue the C99/C11 compat warning, which is more specific @@ -76,7 +76,7 @@ pedwarn_c90 (location_t location, int opt, const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); /* Warnings such as -Wvla are the most specific ones. */ diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index e45f2d2..252d023 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -2399,7 +2399,7 @@ build_component_ref (location_t loc, tree datum, tree component) { /* Special-case the error message for "ptr.field" for the case where the user has confused "." vs "->". */ - rich_location richloc (line_table, loc); + rich_location richloc (loc); /* "loc" should be the "." token. */ richloc.add_fixit_replace (source_range::from_location (loc), "->"); error_at_rich_loc (&richloc, diff --git a/gcc/cp/error.c b/gcc/cp/error.c index e0ba806..62dc228 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -3673,7 +3673,7 @@ pedwarn_cxx98 (location_t location, int opt, const char *gmsgid, ...) diagnostic_info diagnostic; va_list ap; bool ret; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c index 9e51b95..16004d8 100644 --- a/gcc/diagnostic-show-locus.c +++ b/gcc/diagnostic-show-locus.c @@ -117,7 +117,10 @@ class layout_point class layout_range { public: - layout_range (const location_range *loc_range); + layout_range (const expanded_location *start_exploc, + const expanded_location *finish_exploc, + bool show_caret_p, + const expanded_location *caret_exploc); bool contains_point (int row, int column) const; @@ -287,11 +290,14 @@ colorizer::finish_state (int state) Initialize various layout_point fields from expanded_location equivalents; we've already filtered on file. */ -layout_range::layout_range (const location_range *loc_range) -: m_start (loc_range->m_start), - m_finish (loc_range->m_finish), - m_show_caret_p (loc_range->m_show_caret_p), - m_caret (loc_range->m_caret) +layout_range::layout_range (const expanded_location *start_exploc, + const expanded_location *finish_exploc, + bool show_caret_p, + const expanded_location *caret_exploc) +: m_start (*start_exploc), + m_finish (*finish_exploc), + m_show_caret_p (show_caret_p), + m_caret (*caret_exploc) { } @@ -431,7 +437,7 @@ layout::layout (diagnostic_context * context, : m_context (context), m_pp (context->printer), m_diagnostic_kind (diagnostic->kind), - m_exploc (diagnostic->richloc->lazily_expand_location ()), + m_exploc (diagnostic->richloc->get_expanded_location (0)), m_colorizer (context, diagnostic), m_colorize_source_p (context->colorize_source_p), m_layout_ranges (rich_location::MAX_RANGES), @@ -444,28 +450,39 @@ layout::layout (diagnostic_context * context, { /* This diagnostic printer can only cope with "sufficiently sane" ranges. Ignore any ranges that are awkward to handle. */ - location_range *loc_range = richloc->get_range (idx); + const location_range *loc_range = richloc->get_range (idx); + + /* Split the "range" into caret and range information. */ + source_range src_range = get_range_from_loc (line_table, loc_range->m_loc); + + /* Expand the various locations. */ + expanded_location start + = linemap_client_expand_location_to_spelling_point (src_range.m_start); + expanded_location finish + = linemap_client_expand_location_to_spelling_point (src_range.m_finish); + expanded_location caret + = linemap_client_expand_location_to_spelling_point (loc_range->m_loc); /* If any part of the range isn't in the same file as the primary location of this diagnostic, ignore the range. */ - if (loc_range->m_start.file != m_exploc.file) + if (start.file != m_exploc.file) continue; - if (loc_range->m_finish.file != m_exploc.file) + if (finish.file != m_exploc.file) continue; if (loc_range->m_show_caret_p) - if (loc_range->m_caret.file != m_exploc.file) + if (caret.file != m_exploc.file) continue; /* Passed all the tests; add the range to m_layout_ranges so that it will be printed. */ - layout_range ri (loc_range); + layout_range ri (&start, &finish, loc_range->m_show_caret_p, &caret); m_layout_ranges.safe_push (ri); /* Update m_first_line/m_last_line if necessary. */ - if (loc_range->m_start.line < m_first_line) - m_first_line = loc_range->m_start.line; - if (loc_range->m_finish.line > m_last_line) - m_last_line = loc_range->m_finish.line; + if (ri.m_start.m_line < m_first_line) + m_first_line = ri.m_start.m_line; + if (ri.m_finish.m_line > m_last_line) + m_last_line = ri.m_finish.m_line; } /* Adjust m_x_offset. diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index b4d3a7d..b6dbc6a 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -867,7 +867,7 @@ diagnostic_append_note (diagnostic_context *context, diagnostic_info diagnostic; va_list ap; const char *saved_prefix; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_NOTE); @@ -925,7 +925,7 @@ emit_diagnostic (diagnostic_t kind, location_t location, int opt, diagnostic_info diagnostic; va_list ap; bool ret; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); if (kind == DK_PERMERROR) @@ -952,7 +952,7 @@ inform (location_t location, const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_NOTE); @@ -981,7 +981,7 @@ inform_n (location_t location, int n, const char *singular_gmsgid, { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, plural_gmsgid); diagnostic_set_info_translated (&diagnostic, @@ -1000,7 +1000,7 @@ warning (int opt, const char *gmsgid, ...) diagnostic_info diagnostic; va_list ap; bool ret; - rich_location richloc (line_table, input_location); + rich_location richloc (input_location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_WARNING); @@ -1021,7 +1021,7 @@ warning_at (location_t location, int opt, const char *gmsgid, ...) diagnostic_info diagnostic; va_list ap; bool ret; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_WARNING); @@ -1059,7 +1059,7 @@ warning_n (location_t location, int opt, int n, const char *singular_gmsgid, diagnostic_info diagnostic; va_list ap; bool ret; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, plural_gmsgid); diagnostic_set_info_translated (&diagnostic, @@ -1091,7 +1091,7 @@ pedwarn (location_t location, int opt, const char *gmsgid, ...) diagnostic_info diagnostic; va_list ap; bool ret; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN); @@ -1114,7 +1114,7 @@ permerror (location_t location, const char *gmsgid, ...) diagnostic_info diagnostic; va_list ap; bool ret; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, @@ -1150,7 +1150,7 @@ error (const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, input_location); + rich_location richloc (input_location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_ERROR); @@ -1166,7 +1166,7 @@ error_n (location_t location, int n, const char *singular_gmsgid, { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, location); + rich_location richloc (location); va_start (ap, plural_gmsgid); diagnostic_set_info_translated (&diagnostic, @@ -1182,7 +1182,7 @@ error_at (location_t loc, const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, loc); + rich_location richloc (loc); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_ERROR); @@ -1213,7 +1213,7 @@ sorry (const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, input_location); + rich_location richloc (input_location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_SORRY); @@ -1237,7 +1237,7 @@ fatal_error (location_t loc, const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, loc); + rich_location richloc (loc); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_FATAL); @@ -1256,7 +1256,7 @@ internal_error (const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, input_location); + rich_location richloc (input_location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_ICE); @@ -1274,7 +1274,7 @@ internal_error_no_backtrace (const char *gmsgid, ...) { diagnostic_info diagnostic; va_list ap; - rich_location richloc (line_table, input_location); + rich_location richloc (input_location); va_start (ap, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_ICE_NOBT); @@ -1341,17 +1341,3 @@ real_abort (void) { abort (); } - -/* Display the given source_range instance, with MSG as a descriptive - comment. This issues a "note" diagnostic at the range. - - This is declared within libcpp, but implemented here, since it - makes use of the diagnostic-printing machinery. */ - -DEBUG_FUNCTION void -source_range::debug (const char *msg) const -{ - rich_location richloc (line_table, m_start); - richloc.add_range (m_start, m_finish, false); - inform_at_rich_loc (&richloc, "%s", msg); -} diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 9096e16..6794262 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -332,7 +332,7 @@ diagnostic_num_locations (const diagnostic_info * diagnostic) static inline expanded_location diagnostic_expand_location (const diagnostic_info * diagnostic, int which = 0) { - return diagnostic->richloc->get_range (which)->m_caret; + return diagnostic->richloc->get_expanded_location (which); } /* This is somehow the right-side margin of a caret line, that is, we diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c index 8f57aff..3312441 100644 --- a/gcc/fortran/error.c +++ b/gcc/fortran/error.c @@ -773,7 +773,7 @@ gfc_warning (int opt, const char *gmsgid, va_list ap) va_copy (argp, ap); diagnostic_info diagnostic; - rich_location rich_loc (line_table, UNKNOWN_LOCATION); + rich_location rich_loc (UNKNOWN_LOCATION); bool fatal_errors = global_dc->fatal_errors; pretty_printer *pp = global_dc->printer; output_buffer *tmp_buffer = pp->buffer; @@ -1119,7 +1119,7 @@ gfc_warning_now_at (location_t loc, int opt, const char *gmsgid, ...) { va_list argp; diagnostic_info diagnostic; - rich_location rich_loc (line_table, loc); + rich_location rich_loc (loc); bool ret; va_start (argp, gmsgid); @@ -1137,7 +1137,7 @@ gfc_warning_now (int opt, const char *gmsgid, ...) { va_list argp; diagnostic_info diagnostic; - rich_location rich_loc (line_table, UNKNOWN_LOCATION); + rich_location rich_loc (UNKNOWN_LOCATION); bool ret; va_start (argp, gmsgid); @@ -1157,7 +1157,7 @@ gfc_error_now (const char *gmsgid, ...) { va_list argp; diagnostic_info diagnostic; - rich_location rich_loc (line_table, UNKNOWN_LOCATION); + rich_location rich_loc (UNKNOWN_LOCATION); error_buffer.flag = true; @@ -1175,7 +1175,7 @@ gfc_fatal_error (const char *gmsgid, ...) { va_list argp; diagnostic_info diagnostic; - rich_location rich_loc (line_table, UNKNOWN_LOCATION); + rich_location rich_loc (UNKNOWN_LOCATION); va_start (argp, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &argp, &rich_loc, DK_FATAL); @@ -1241,7 +1241,7 @@ gfc_error (const char *gmsgid, va_list ap) } diagnostic_info diagnostic; - rich_location richloc (line_table, UNKNOWN_LOCATION); + rich_location richloc (UNKNOWN_LOCATION); bool fatal_errors = global_dc->fatal_errors; pretty_printer *pp = global_dc->printer; output_buffer *tmp_buffer = pp->buffer; @@ -1287,7 +1287,7 @@ gfc_internal_error (const char *gmsgid, ...) { va_list argp; diagnostic_info diagnostic; - rich_location rich_loc (line_table, UNKNOWN_LOCATION); + rich_location rich_loc (UNKNOWN_LOCATION); va_start (argp, gmsgid); diagnostic_set_info (&diagnostic, gmsgid, &argp, &rich_loc, DK_ICE); diff --git a/gcc/gcc-rich-location.c b/gcc/gcc-rich-location.c index b0ec47b..88bd82d 100644 --- a/gcc/gcc-rich-location.c +++ b/gcc/gcc-rich-location.c @@ -41,28 +41,6 @@ along with GCC; see the file COPYING3. If not see #include "cpplib.h" #include "diagnostic.h" -/* Extract any source range information from EXPR and write it - to *R. */ - -static bool -get_range_for_expr (tree expr, location_range *r) -{ - if (EXPR_HAS_RANGE (expr)) - { - source_range sr = EXPR_LOCATION_RANGE (expr); - - /* Do we have meaningful data? */ - if (sr.m_start && sr.m_finish) - { - r->m_start = expand_location (sr.m_start); - r->m_finish = expand_location (sr.m_finish); - return true; - } - } - - return false; -} - /* Add a range to the rich_location, covering expression EXPR. */ void @@ -70,10 +48,8 @@ gcc_rich_location::add_expr (tree expr) { gcc_assert (expr); - location_range r; - r.m_show_caret_p = false; - if (get_range_for_expr (expr, &r)) - add_range (&r); + if (CAN_HAVE_RANGE_P (expr)) + add_range (EXPR_LOCATION (expr), false); } /* If T is an expression, add a range for it to the rich_location. */ diff --git a/gcc/gcc-rich-location.h b/gcc/gcc-rich-location.h index 2f9291d..60e9e88 100644 --- a/gcc/gcc-rich-location.h +++ b/gcc/gcc-rich-location.h @@ -25,16 +25,9 @@ along with GCC; see the file COPYING3. If not see class gcc_rich_location : public rich_location { public: - /* Constructors. */ - - /* Constructing from a location. */ + /* Constructor. */ gcc_rich_location (source_location loc) : - rich_location (line_table, loc) {} - - /* Constructing from a source_range. */ - gcc_rich_location (source_range src_range) : - rich_location (src_range) {} - + rich_location (loc) {} /* Methods for adding ranges via gcc entities. */ void diff --git a/gcc/genmatch.c b/gcc/genmatch.c index ef39cb0..c06279a 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -119,7 +119,7 @@ __attribute__((format (printf, 2, 3))) #endif fatal_at (const cpp_token *tk, const char *msg, ...) { - rich_location richloc (line_table, tk->src_loc); + rich_location richloc (tk->src_loc); va_list ap; va_start (ap, msg); error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap); @@ -132,7 +132,7 @@ __attribute__((format (printf, 2, 3))) #endif fatal_at (source_location loc, const char *msg, ...) { - rich_location richloc (line_table, loc); + rich_location richloc (loc); va_list ap; va_start (ap, msg); error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap); @@ -145,7 +145,7 @@ __attribute__((format (printf, 2, 3))) #endif warning_at (const cpp_token *tk, const char *msg, ...) { - rich_location richloc (line_table, tk->src_loc); + rich_location richloc (tk->src_loc); va_list ap; va_start (ap, msg); error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap); @@ -158,7 +158,7 @@ __attribute__((format (printf, 2, 3))) #endif warning_at (source_location loc, const char *msg, ...) { - rich_location richloc (line_table, loc); + rich_location richloc (loc); va_list ap; va_start (ap, msg); error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap); diff --git a/gcc/pretty-print.c b/gcc/pretty-print.c index 3365074..cd35792 100644 --- a/gcc/pretty-print.c +++ b/gcc/pretty-print.c @@ -38,7 +38,7 @@ void text_info::set_location (unsigned int idx, location_t loc, bool show_caret_p) { gcc_checking_assert (m_richloc); - m_richloc->set_range (line_table, idx, loc, show_caret_p); + m_richloc->set_range (idx, loc, show_caret_p); } location_t diff --git a/gcc/rtl-error.c b/gcc/rtl-error.c index 088bb8a..96da2bd 100644 --- a/gcc/rtl-error.c +++ b/gcc/rtl-error.c @@ -67,7 +67,7 @@ diagnostic_for_asm (const rtx_insn *insn, const char *msg, va_list *args_ptr, diagnostic_t kind) { diagnostic_info diagnostic; - rich_location richloc (line_table, location_for_asm (insn)); + rich_location richloc (location_for_asm (insn)); diagnostic_set_info (&diagnostic, msg, args_ptr, &richloc, kind); diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_show_trees.c b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_show_trees.c index 5a911c1..8b1d1b7 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_show_trees.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_show_trees.c @@ -42,25 +42,6 @@ So as a nasty workaround, the following material is copied&pasted from gcc-rich-location.c: */ -static bool -get_range_for_expr (tree expr, location_range *r) -{ - if (EXPR_HAS_RANGE (expr)) - { - source_range sr = EXPR_LOCATION_RANGE (expr); - - /* Do we have meaningful data? */ - if (sr.m_start && sr.m_finish) - { - r->m_start = expand_location (sr.m_start); - r->m_finish = expand_location (sr.m_finish); - return true; - } - } - - return false; -} - /* Add a range to the rich_location, covering expression EXPR. */ void @@ -68,10 +49,8 @@ gcc_rich_location::add_expr (tree expr) { gcc_assert (expr); - location_range r; - r.m_show_caret_p = false; - if (get_range_for_expr (expr, &r)) - add_range (&r); + if (CAN_HAVE_RANGE_P (expr)) + add_range (EXPR_LOCATION (expr), false); } /* FIXME: end of material taken from gcc-rich-location.c */ @@ -96,13 +75,7 @@ show_tree (tree node) enum tree_code code = TREE_CODE (node); location_range *range = richloc.get_range (1); - inform_at_rich_loc (&richloc, - "%s at range %i:%i-%i:%i", - get_tree_code_name (code), - range->m_start.line, - range->m_start.column, - range->m_finish.line, - range->m_finish.column); + inform_at_rich_loc (&richloc, "%s", get_tree_code_name (code)); /* Recurse. */ int min_idx = 0; diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c index 02a2aef..3f9d139 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c @@ -140,6 +140,15 @@ custom_diagnostic_finalizer (diagnostic_context *context, pp_newline_and_flush (context->printer); } +/* Add a location to RICHLOC with caret==start at START, ranging to FINISH. */ + +static void +add_range (rich_location *richloc, location_t start, location_t finish, + bool show_caret_p) +{ + richloc->add_range (make_location (start, start, finish), show_caret_p); +} + /* Exercise the diagnostic machinery to emit various warnings, for use by diagnostic-test-show-locus-*.c. @@ -164,54 +173,49 @@ test_show_locus (function *fun) if (0 == strcmp (fnname, "test_simple")) { const int line = fnstart_line + 2; - rich_location richloc (line_table, get_loc (line, 15)); - richloc.add_range (get_loc (line, 10), get_loc (line, 14), false); - richloc.add_range (get_loc (line, 16), get_loc (line, 16), false); + rich_location richloc (get_loc (line, 15)); + add_range (&richloc, get_loc (line, 10), get_loc (line, 14), false); + add_range (&richloc, get_loc (line, 16), get_loc (line, 16), false); warning_at_rich_loc (&richloc, 0, "test"); } if (0 == strcmp (fnname, "test_simple_2")) { const int line = fnstart_line + 2; - rich_location richloc (line_table, get_loc (line, 24)); - richloc.add_range (get_loc (line, 6), - get_loc (line, 22), false); - richloc.add_range (get_loc (line, 26), - get_loc (line, 43), false); + rich_location richloc (get_loc (line, 24)); + add_range (&richloc, get_loc (line, 6), get_loc (line, 22), false); + add_range (&richloc, get_loc (line, 26), get_loc (line, 43), false); warning_at_rich_loc (&richloc, 0, "test"); } if (0 == strcmp (fnname, "test_multiline")) { const int line = fnstart_line + 2; - rich_location richloc (line_table, get_loc (line + 1, 7)); - richloc.add_range (get_loc (line, 7), - get_loc (line, 23), false); - richloc.add_range (get_loc (line + 1, 9), - get_loc (line + 1, 26), false); + rich_location richloc (get_loc (line + 1, 7)); + add_range (&richloc, get_loc (line, 7), get_loc (line, 23), false); + add_range (&richloc, get_loc (line + 1, 9), get_loc (line + 1, 26), + false); warning_at_rich_loc (&richloc, 0, "test"); } if (0 == strcmp (fnname, "test_many_lines")) { const int line = fnstart_line + 2; - rich_location richloc (line_table, get_loc (line + 5, 7)); - richloc.add_range (get_loc (line, 7), - get_loc (line + 4, 65), false); - richloc.add_range (get_loc (line + 5, 9), - get_loc (line + 10, 61), false); + rich_location richloc (get_loc (line + 5, 7)); + add_range (&richloc, get_loc (line, 7), get_loc (line + 4, 65), false); + add_range (&richloc, get_loc (line + 5, 9), get_loc (line + 10, 61), + false); warning_at_rich_loc (&richloc, 0, "test"); } - /* Example of a rich_location constructed directly from a - source_range where the range is larger than one character. */ + /* Example of a rich_location where the range is larger than + one character. */ if (0 == strcmp (fnname, "test_richloc_from_proper_range")) { const int line = fnstart_line + 2; - source_range src_range; - src_range.m_start = get_loc (line, 12); - src_range.m_finish = get_loc (line, 16); - rich_location richloc (src_range); + location_t start = get_loc (line, 12); + location_t finish = get_loc (line, 16); + rich_location richloc (make_location (start, start, finish)); warning_at_rich_loc (&richloc, 0, "test"); } @@ -220,15 +224,9 @@ test_show_locus (function *fun) if (0 == strcmp (fnname, "test_caret_within_proper_range")) { const int line = fnstart_line + 2; - location_t caret = get_loc (line, 16); - source_range src_range; - src_range.m_start = get_loc (line, 12); - src_range.m_finish = get_loc (line, 20); - location_t combined_loc = COMBINE_LOCATION_DATA (line_table, - caret, - src_range, - NULL); - warning_at (combined_loc, 0, "test"); + warning_at (make_location (get_loc (line, 16), get_loc (line, 12), + get_loc (line, 20)), + 0, "test"); } /* Example of a very wide line, where the information of interest @@ -236,15 +234,9 @@ test_show_locus (function *fun) if (0 == strcmp (fnname, "test_very_wide_line")) { const int line = fnstart_line + 2; - location_t caret = get_loc (line, 94); - source_range src_range; - src_range.m_start = get_loc (line, 90); - src_range.m_finish = get_loc (line, 98); - location_t combined_loc = COMBINE_LOCATION_DATA (line_table, - caret, - src_range, - NULL); - warning_at (combined_loc, 0, "test"); + warning_at (make_location (get_loc (line, 94), get_loc (line, 90), + get_loc (line, 98)), + 0, "test"); } /* Example of multiple carets. */ @@ -253,8 +245,8 @@ test_show_locus (function *fun) const int line = fnstart_line + 2; location_t caret_a = get_loc (line, 7); location_t caret_b = get_loc (line, 11); - rich_location richloc (line_table, caret_a); - richloc.add_range (caret_b, caret_b, true); + rich_location richloc (caret_a); + add_range (&richloc, caret_b, caret_b, true); global_dc->caret_chars[0] = 'A'; global_dc->caret_chars[1] = 'B'; warning_at_rich_loc (&richloc, 0, "test"); @@ -266,11 +258,10 @@ test_show_locus (function *fun) if (0 == strcmp (fnname, "test_fixit_insert")) { const int line = fnstart_line + 2; - source_range src_range; - src_range.m_start = get_loc (line, 19); - src_range.m_finish = get_loc (line, 22); - rich_location richloc (src_range); - richloc.add_fixit_insert (src_range.m_start, "{"); + location_t start = get_loc (line, 19); + location_t finish = get_loc (line, 22); + rich_location richloc (make_location (start, start, finish)); + richloc.add_fixit_insert (start, "{"); richloc.add_fixit_insert (get_loc (line, 23), "}"); warning_at_rich_loc (&richloc, 0, "example of insertion hints"); } @@ -278,10 +269,12 @@ test_show_locus (function *fun) if (0 == strcmp (fnname, "test_fixit_remove")) { const int line = fnstart_line + 2; + location_t start = get_loc (line, 8); + location_t finish = get_loc (line, 8); + rich_location richloc (make_location (start, start, finish)); source_range src_range; - src_range.m_start = get_loc (line, 8); - src_range.m_finish = get_loc (line, 8); - rich_location richloc (src_range); + src_range.m_start = start; + src_range.m_finish = finish; richloc.add_fixit_remove (src_range); warning_at_rich_loc (&richloc, 0, "example of a removal hint"); } @@ -289,10 +282,12 @@ test_show_locus (function *fun) if (0 == strcmp (fnname, "test_fixit_replace")) { const int line = fnstart_line + 2; + location_t start = get_loc (line, 2); + location_t finish = get_loc (line, 19); + rich_location richloc (make_location (start, start, finish)); source_range src_range; - src_range.m_start = get_loc (line, 2); - src_range.m_finish = get_loc (line, 19); - rich_location richloc (src_range); + src_range.m_start = start; + src_range.m_finish = finish; richloc.add_fixit_replace (src_range, "gtk_widget_show_all"); warning_at_rich_loc (&richloc, 0, "example of a replacement hint"); } @@ -309,8 +304,8 @@ test_show_locus (function *fun) const int line = fnstart_line + 3; location_t caret_a = get_loc (line, 5); location_t caret_b = get_loc (line - 1, 19); - rich_location richloc (line_table, caret_a); - richloc.add_range (caret_b, caret_b, true); + rich_location richloc (caret_a); + richloc.add_range (caret_b, true); global_dc->caret_chars[0] = '1'; global_dc->caret_chars[1] = '2'; warning_at_rich_loc (&richloc, 0, "test"); diff --git a/libcpp/errors.c b/libcpp/errors.c index c27a417..32c01e6 100644 --- a/libcpp/errors.c +++ b/libcpp/errors.c @@ -57,7 +57,7 @@ cpp_diagnostic (cpp_reader * pfile, int level, int reason, if (!pfile->cb.error) abort (); - rich_location richloc (pfile->line_table, src_loc); + rich_location richloc (src_loc); ret = pfile->cb.error (pfile, level, reason, &richloc, _(msgid), ap); return ret; @@ -140,7 +140,7 @@ cpp_diagnostic_with_line (cpp_reader * pfile, int level, int reason, if (!pfile->cb.error) abort (); - rich_location richloc (pfile->line_table, src_loc); + rich_location richloc (src_loc); richloc.override_column (column); ret = pfile->cb.error (pfile, level, reason, &richloc, _(msgid), ap); diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h index 73c583e..0cd3c1d 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -273,20 +273,6 @@ struct GTY(()) source_range source_location m_start; source_location m_finish; - /* Display this source_range instance, with MSG as a descriptive - comment. This issues a "note" diagnostic at the range, using - gcc's diagnostic machinery. - - This is declared here, but is implemented within gcc/diagnostic.c, - since it makes use of gcc's diagnostic-printing machinery. This - is a slight layering violation, but this is sufficiently useful - for debugging that it's worth it. - - This declaration would have a DEBUG_FUNCTION annotation, but that - is implemented in gcc/system.h and thus is not available here in - libcpp. */ - void debug (const char *msg) const; - /* We avoid using constructors, since various structs that don't yet have constructors will embed instances of source_range. */ @@ -1249,13 +1235,12 @@ typedef struct i.e. "3:1:" in GCC corresponds to "(3, 0)" in Emacs. */ -/* Ranges are closed - m_start is the first location within the range, and - m_finish is the last location within the range. */ +/* A location within a rich_location: a caret&range, with + the caret potentially flagged for display. */ + struct location_range { - expanded_location m_start; - expanded_location m_finish; + source_location m_loc; /* Should a caret be drawn for this range? Typically this is true for the 0th range, and false for subsequent ranges, @@ -1267,7 +1252,6 @@ struct location_range where "1" and "2" are notionally carets. */ bool m_show_caret_p; - expanded_location m_caret; }; class fixit_hint; @@ -1276,9 +1260,10 @@ class fixit_hint; class fixit_replace; /* A "rich" source code location, for use when printing diagnostics. - A rich_location has one or more ranges, each optionally with - a caret. Typically the zeroth range has a caret; other ranges - sometimes have carets. + A rich_location has one or more carets&ranges, where the carets + are optional. These are referred to as "ranges" from here. + Typically the zeroth range has a caret; other ranges sometimes + have carets. The "primary" location of a rich_location is the caret of range 0, used for determining the line/column when printing diagnostic @@ -1349,35 +1334,21 @@ class fixit_hint; class rich_location { public: - /* Constructors. */ - - /* Constructing from a location. */ - rich_location (line_maps *set, source_location loc); - - /* Constructing from a source_range. */ - rich_location (source_range src_range); + /* Constructor. */ + rich_location (source_location loc); /* Destructor. */ ~rich_location (); /* Accessors. */ - source_location get_loc () const { return m_loc; } - - source_location *get_loc_addr () { return &m_loc; } + source_location get_loc () const { return get_loc (0); } + source_location get_loc (unsigned int idx) const; void - add_range (source_location start, source_location finish, - bool show_caret_p); + add_range (source_location loc, bool show_caret_p); void - add_range (source_range src_range, bool show_caret_p); - - void - add_range (location_range *src_range); - - void - set_range (line_maps *set, unsigned int idx, source_location loc, - bool show_caret_p); + set_range (unsigned int idx, source_location loc, bool show_caret_p); unsigned int get_num_locations () const { return m_num_ranges; } @@ -1387,7 +1358,7 @@ class rich_location return &m_ranges[idx]; } - expanded_location lazily_expand_location (); + expanded_location get_expanded_location (unsigned int idx); void override_column (int column); @@ -1412,11 +1383,11 @@ public: static const int MAX_FIXIT_HINTS = 2; protected: - source_location m_loc; - unsigned int m_num_ranges; location_range m_ranges[MAX_RANGES]; + int m_column_override; + bool m_have_expanded_location; expanded_location m_expanded_location; diff --git a/libcpp/line-map.c b/libcpp/line-map.c index 209d0fb..6bdf841 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -1973,29 +1973,13 @@ source_range::intersects_line_p (const char *file, int line) const /* Construct a rich_location with location LOC as its initial range. */ -rich_location::rich_location (line_maps *set, source_location loc) : - m_loc (loc), +rich_location::rich_location (source_location loc) : m_num_ranges (0), + m_column_override (0), m_have_expanded_location (false), m_num_fixit_hints (0) { - /* Set up the 0th range, extracting any range from LOC. */ - source_range src_range = get_range_from_loc (set, loc); - add_range (src_range, true); - m_ranges[0].m_caret = lazily_expand_location (); -} - -/* Construct a rich_location with source_range SRC_RANGE as its - initial range. */ - -rich_location::rich_location (source_range src_range) -: m_loc (src_range.m_start), - m_num_ranges (0), - m_have_expanded_location (false), - m_num_fixit_hints (0) -{ - /* Set up the 0th range: */ - add_range (src_range, true); + add_range (loc, true); } /* The destructor for class rich_location. */ @@ -2006,64 +1990,60 @@ rich_location::~rich_location () delete m_fixit_hints[i]; } -/* Get an expanded_location for this rich_location's primary - location. */ +/* Get location IDX within this rich_location. */ + +source_location +rich_location::get_loc (unsigned int idx) const +{ + linemap_assert (idx < m_num_ranges); + return m_ranges[idx].m_loc; +} + +/* Expand location IDX within this rich_location. */ expanded_location -rich_location::lazily_expand_location () +rich_location::get_expanded_location (unsigned int idx) { - if (!m_have_expanded_location) + if (idx == 0) { - m_expanded_location - = linemap_client_expand_location_to_spelling_point (m_loc); - m_have_expanded_location = true; - } + /* Cache the expansion of the primary location. */ + if (!m_have_expanded_location) + { + m_expanded_location + = linemap_client_expand_location_to_spelling_point (get_loc (0)); + if (m_column_override) + m_expanded_location.column = m_column_override; + m_have_expanded_location = true; + } - return m_expanded_location; + return m_expanded_location; + } + else + return linemap_client_expand_location_to_spelling_point (get_loc (idx)); } -/* Set the column of the primary location. */ +/* Potentially set the column of the primary location, with 0 meaning + "don't override it". */ void rich_location::override_column (int column) { - lazily_expand_location (); - m_expanded_location.column = column; + m_column_override = column; + m_have_expanded_location = false; } /* Add the given range. */ void -rich_location::add_range (source_location start, source_location finish, - bool show_caret_p) +rich_location::add_range (source_location loc, bool show_caret_p) { linemap_assert (m_num_ranges < MAX_RANGES); location_range *range = &m_ranges[m_num_ranges++]; - range->m_start = linemap_client_expand_location_to_spelling_point (start); - range->m_finish = linemap_client_expand_location_to_spelling_point (finish); - range->m_caret = range->m_start; + range->m_loc = loc; range->m_show_caret_p = show_caret_p; } -/* Add the given range. */ - -void -rich_location::add_range (source_range src_range, bool show_caret_p) -{ - linemap_assert (m_num_ranges < MAX_RANGES); - - add_range (src_range.m_start, src_range.m_finish, show_caret_p); -} - -void -rich_location::add_range (location_range *src_range) -{ - linemap_assert (m_num_ranges < MAX_RANGES); - - m_ranges[m_num_ranges++] = *src_range; -} - /* Add or overwrite the location given by IDX, setting its location to LOC, and setting its "should my caret be printed" flag to SHOW_CARET_P. @@ -2078,8 +2058,8 @@ rich_location::add_range (location_range *src_range) - the "%C" and "%L" format codes in the Fortran frontend. */ void -rich_location::set_range (line_maps *set, unsigned int idx, - source_location loc, bool show_caret_p) +rich_location::set_range (unsigned int idx, source_location loc, + bool show_caret_p) { linemap_assert (idx < MAX_RANGES); @@ -2087,28 +2067,17 @@ rich_location::set_range (line_maps *set, unsigned int idx, on the end of the array. */ linemap_assert (idx <= m_num_ranges); - source_range src_range = get_range_from_loc (set, loc); - location_range *locrange = &m_ranges[idx]; - locrange->m_start - = linemap_client_expand_location_to_spelling_point (src_range.m_start); - locrange->m_finish - = linemap_client_expand_location_to_spelling_point (src_range.m_finish); - + locrange->m_loc = loc; locrange->m_show_caret_p = show_caret_p; - locrange->m_caret - = linemap_client_expand_location_to_spelling_point (loc); /* Are we adding a range onto the end? */ if (idx == m_num_ranges) m_num_ranges = idx + 1; if (idx == 0) - { - m_loc = loc; - /* Mark any cached value here as dirty. */ - m_have_expanded_location = false; - } + /* Mark any cached value here as dirty. */ + m_have_expanded_location = false; } /* Add a fixit-hint, suggesting insertion of NEW_CONTENT -- 1.8.5.3