From 150210a7169d081198b3663c0e8ed330f9874a97 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm@redhat.com>
Date: Fri, 10 Jun 2016 12:34:30 -0400
Subject: [PATCH 05/22] Introduce gcc_rich_location::add_fixit_misspelled_id

There's a fair amount of repetition in the code to emit
fixits for misspelled identifiers, and I plan to add more
such fixits, so this patch moves it to a helper method.

gcc/c/ChangeLog:
	* c-typeck.c (build_component_ref): Simplify fixit code by
	using gcc_rich_location::add_fixit_misspelled_id.
	(set_init_label): Likewise.

gcc/cp/ChangeLog:
	* typeck.c: Include "gcc-rich-location.h".
	(finish_class_member_access_expr): Simplify fixit code by
	using gcc_rich_location::add_fixit_misspelled_id.

gcc/ChangeLog:
	* gcc-rich-location.c
	(gcc_rich_location::add_fixit_misspelled_id): New method.
	* gcc-rich-location.h
	(gcc_rich_location::add_fixit_misspelled_id): Add decl.
---
 gcc/c/c-typeck.c        | 16 ++++------------
 gcc/cp/typeck.c         | 10 ++++------
 gcc/gcc-rich-location.c | 14 ++++++++++++++
 gcc/gcc-rich-location.h |  3 +++
 4 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index ea04d5e..f987508 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -2371,14 +2371,9 @@ build_component_ref (location_t loc, tree datum, tree component,
 		 we have a valid range for the component.  */
 	      location_t reported_loc
 		= (component_loc != UNKNOWN_LOCATION) ? component_loc : loc;
-	      rich_location rich_loc (line_table, reported_loc);
+	      gcc_rich_location rich_loc (reported_loc);
 	      if (component_loc != UNKNOWN_LOCATION)
-		{
-		  source_range component_range =
-		    get_range_from_loc (line_table, component_loc);
-		  rich_loc.add_fixit_replace (component_range,
-					      IDENTIFIER_POINTER (guessed_id));
-		}
+		rich_loc.add_fixit_misspelled_id (component_loc, guessed_id);
 	      error_at_rich_loc
 		(&rich_loc,
 		 "%qT has no member named %qE; did you mean %qE?",
@@ -8234,11 +8229,8 @@ set_init_label (location_t loc, tree fieldname, location_t fieldname_loc,
       tree guessed_id = lookup_field_fuzzy (constructor_type, fieldname);
       if (guessed_id)
 	{
-	  rich_location rich_loc (line_table, fieldname_loc);
-	  source_range component_range =
-	    get_range_from_loc (line_table, fieldname_loc);
-	  rich_loc.add_fixit_replace (component_range,
-				      IDENTIFIER_POINTER (guessed_id));
+	  gcc_rich_location rich_loc (fieldname_loc);
+	  rich_loc.add_fixit_misspelled_id (fieldname_loc, guessed_id);
 	  error_at_rich_loc
 	    (&rich_loc,
 	     "%qT has no member named %qE; did you mean %qE?",
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index f68c2a3..2ccd2da 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -36,6 +36,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "c-family/c-objc.h"
 #include "c-family/c-ubsan.h"
 #include "params.h"
+#include "gcc-rich-location.h"
 
 static tree cp_build_addr_expr_strict (tree, tsubst_flags_t);
 static tree cp_build_function_call (tree, tree, tsubst_flags_t);
@@ -2831,12 +2832,9 @@ finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
 		  if (guessed_id)
 		    {
 		      location_t bogus_component_loc = input_location;
-		      rich_location rich_loc (line_table, bogus_component_loc);
-		      source_range bogus_component_range =
-			get_range_from_loc (line_table, bogus_component_loc);
-		      rich_loc.add_fixit_replace
-			(bogus_component_range,
-			 IDENTIFIER_POINTER (guessed_id));
+		      gcc_rich_location rich_loc (bogus_component_loc);
+		      rich_loc.add_fixit_misspelled_id (bogus_component_loc,
+							guessed_id);
 		      error_at_rich_loc
 			(&rich_loc,
 			 "%q#T has no member named %qE; did you mean %qE?",
diff --git a/gcc/gcc-rich-location.c b/gcc/gcc-rich-location.c
index a03ce0e..15c0700 100644
--- a/gcc/gcc-rich-location.c
+++ b/gcc/gcc-rich-location.c
@@ -60,3 +60,17 @@ gcc_rich_location::maybe_add_expr (tree t)
   if (EXPR_P (t))
     add_expr (t);
 }
+
+/* Add a fixit hint suggesting replacing the range at MISSPELLED_TOKEN_LOC
+   with the identifier HINT_ID.  */
+
+void
+gcc_rich_location::add_fixit_misspelled_id (location_t misspelled_token_loc,
+					    tree hint_id)
+{
+  gcc_assert (TREE_CODE (hint_id) == IDENTIFIER_NODE);
+
+  source_range misspelled_token_range
+    = get_range_from_loc (line_table, misspelled_token_loc);
+  add_fixit_replace (misspelled_token_range, IDENTIFIER_POINTER (hint_id));
+}
diff --git a/gcc/gcc-rich-location.h b/gcc/gcc-rich-location.h
index fd332de..9c8a790 100644
--- a/gcc/gcc-rich-location.h
+++ b/gcc/gcc-rich-location.h
@@ -42,6 +42,9 @@ class gcc_rich_location : public rich_location
 
   void
   maybe_add_expr (tree t);
+
+  void add_fixit_misspelled_id (location_t misspelled_token_loc,
+				tree hint_id);
 };
 
 #endif /* GCC_RICH_LOCATION_H */
-- 
1.8.5.3

