[COMMITTED] algol68: factorize out a68_get_line_location

Jose E. Marchesi jemarch@gnu.org
Fri Mar 14 09:46:53 GMT 2025


---
 gcc/algol68/a68-diagnostics.cc | 36 ++++++++++------------------------
 gcc/algol68/a68-parser.cc      | 16 ++++++++++++++-
 gcc/algol68/a68.h              |  1 +
 3 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/gcc/algol68/a68-diagnostics.cc b/gcc/algol68/a68-diagnostics.cc
index 6063a4fb011..3b5d0dae795 100644
--- a/gcc/algol68/a68-diagnostics.cc
+++ b/gcc/algol68/a68-diagnostics.cc
@@ -358,14 +358,7 @@ diagnostic (int sev, int opt,
       if (p != NO_NODE)
 	loc = a68_get_node_location (p);
       else if (line != NO_LINE)
-	{
-	  /* XXX abstract this in a function and use it in an
-	     a68_get_line_location function.  */
-	  linemap_add (line_table, LC_ENTER, 0, FILENAME (line), NUMBER (line));
-	  linemap_line_start (line_table, NUMBER (line), 0);
-	  loc = linemap_position_for_column (line_table, pos - STRING (line) + 1);
-	  linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
-	}
+	loc = a68_get_line_location (line, pos);
       else
 	loc = UNKNOWN_LOCATION;
 
@@ -438,32 +431,23 @@ a68_warning (NODE_T *p, int opt,
 /* Emit diagnostics.  */
 
 void
-a68_emit_diagnostics (LINE_T *p)
+a68_emit_diagnostics (LINE_T *line)
 {
-  for (; p != NO_LINE; FORWARD (p))
+  for (; line != NO_LINE; FORWARD (line))
     {
-      for (DIAGNOSTIC_T *d = DIAGNOSTICS (p); d != NO_DIAGNOSTIC; FORWARD (d))
+      for (DIAGNOSTIC_T *d = DIAGNOSTICS (line); d != NO_DIAGNOSTIC; FORWARD (d))
 	{
-	  location_t gcc_location = input_location;
-	  const char *filename = FILENAME (p);
-	  char *pos;
-	  int column = 0;
+	  location_t loc;
 
-	  if (WHERE (d) != NO_NODE && p == LINE (INFO (WHERE (d))))
-	    pos = CHAR_IN_LINE (INFO (WHERE (d)));
+	  if (WHERE (d) != NO_NODE && line == LINE (INFO (WHERE (d))))
+	    loc = a68_get_node_location (WHERE (d));
 	  else
-	    pos = STRING (p);
-	  column = pos - STRING (p) + 1;
-
-	  linemap_add (line_table, LC_ENTER, 0, filename, NUMBER (p));
-	  linemap_line_start (line_table, NUMBER (p), 0);
-	  gcc_location = linemap_position_for_column (line_table, column);
-	  linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
+	    loc = a68_get_line_location (line, STRING (line));
 
 	  if (SEVERITY (d) == A68_WARNING)
-	    warning_at (gcc_location, OPT (d), "%s", TEXT (d));
+	    warning_at (loc, OPT (d), "%s", TEXT (d));
 	  else if (SEVERITY (d) == A68_ERROR)
-	    error_at (gcc_location, "%s", TEXT (d));
+	    error_at (loc, "%s", TEXT (d));
 	  else
 	    /* Fatal errors are emitted immediately.  */
 	    gcc_unreachable ();
diff --git a/gcc/algol68/a68-parser.cc b/gcc/algol68/a68-parser.cc
index 0eaba12f6e2..a88d8c6056e 100644
--- a/gcc/algol68/a68-parser.cc
+++ b/gcc/algol68/a68-parser.cc
@@ -1121,7 +1121,7 @@ a68_get_node_location (NODE_T *p)
   unsigned column_number = CHAR_IN_LINE (INFO (p)) - STRING (line) + 1;
   const char *filename = FILENAME (line);
 
-  location_t gcc_location = input_location;
+  location_t gcc_location;
 
   linemap_add (line_table, LC_ENTER, 0, filename, line_number);
   linemap_line_start (line_table, line_number, 0);
@@ -1130,3 +1130,17 @@ a68_get_node_location (NODE_T *p)
 
   return gcc_location;
 }
+
+/* Get the location of POS inside LINE as a GCC location.  */
+
+location_t
+a68_get_line_location (LINE_T *line, const char *pos)
+{
+  location_t loc;
+
+  linemap_add (line_table, LC_ENTER, 0, FILENAME (line), NUMBER (line));
+  linemap_line_start (line_table, NUMBER (line), 0);
+  loc = linemap_position_for_column (line_table, pos - STRING (line) + 1);
+  linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
+  return loc;
+}
diff --git a/gcc/algol68/a68.h b/gcc/algol68/a68.h
index 2c9881070a3..1dc82406a01 100644
--- a/gcc/algol68/a68.h
+++ b/gcc/algol68/a68.h
@@ -245,6 +245,7 @@ void a68_bufcpy (char *dst, const char *src, int len);
 char *a68_new_string (const char *t, ...);
 const char *a68_attribute_name (enum a68_attribute attr);
 location_t a68_get_node_location (NODE_T *p);
+location_t a68_get_line_location (LINE_T *line, const char *pos);
 
 /* a68-parser-top-down.cc  */
 
-- 
2.30.2



More information about the Algol68 mailing list