This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 1/3] Delay location expansion within rich_location until printing


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]