Several of the selftests in diagnostic-show-locus.cc and input.cc are
sensitive to linemap internals. Adjust them here so they will support 64-bit
location_t if configured.

Likewise, handle 64-bit location_t in the support for
-fdump-internal-locations. As was done with the analyzer, convert to
(unsigned long long) explicitly so that 32- and 64-bit can be handled with
the same printf formats.

gcc/ChangeLog:

        * diagnostic-show-locus.cc
        (test_one_liner_fixit_validation_adhoc_locations): Adapt so it can
        effectively test 7-bit ranges instead of 5-bit ranges.
        (test_one_liner_fixit_validation_adhoc_locations_utf8): Likewise.
        * input.cc (get_end_location): Adjust types to support 64-bit
        location_t.
        (write_digit_row): Likewise.
        (dump_location_range): Likewise.
        (dump_location_info): Likewise.
        (class line_table_case): Likewise.
        (test_accessing_ordinary_linemaps): Replace some hard-coded
        constants with the values defined in line-map.h.
        (for_each_line_table_case): Likewise.
---
 gcc/diagnostic-show-locus.cc | 128 +++++++++++++++++++++++++++++------
 gcc/input.cc                 | 100 ++++++++++++++-------------
 2 files changed, 157 insertions(+), 71 deletions(-)

diff --git a/gcc/diagnostic-show-locus.cc b/gcc/diagnostic-show-locus.cc
index a2a4b047ff9..ffe9e807104 100644
--- a/gcc/diagnostic-show-locus.cc
+++ b/gcc/diagnostic-show-locus.cc
@@ -4013,12 +4013,12 @@ test_one_liner_fixit_validation_adhoc_locations ()
 {
   /* Generate a range that's too long to be packed, so must
      be stored as an ad-hoc location (given the defaults
-     of 5 bits or 0 bits of packed range); 41 columns > 2**5.  */
+     of 5 or 7 bits or 0 bits of packed range); 150 columns > 2**7.  */
   const location_t c7 = linemap_position_for_column (line_table, 7);
-  const location_t c47 = linemap_position_for_column (line_table, 47);
-  const location_t loc = make_location (c7, c7, c47);
+  const location_t c157 = linemap_position_for_column (line_table, 157);
+  const location_t loc = make_location (c7, c7, c157);
 
-  if (c47 > LINE_MAP_MAX_LOCATION_WITH_COLS)
+  if (c157 > LINE_MAP_MAX_LOCATION_WITH_COLS)
     return;
 
   ASSERT_TRUE (IS_ADHOC_LOC (loc));
@@ -4032,7 +4032,18 @@ test_one_liner_fixit_validation_adhoc_locations ()
 
     test_diagnostic_context dc;
     ASSERT_STREQ (" foo = bar.field;\n"
-                 "       ^~~~~~~~~~                               \n"
+                 "       ^~~~~~~~~~                               "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          \n"
                  "       test\n",
                  dc.test_show_locus (richloc));
   }
@@ -4040,29 +4051,62 @@ test_one_liner_fixit_validation_adhoc_locations ()
   /* Remove.  */
   {
     rich_location richloc (line_table, loc);
-    source_range range = source_range::from_locations (loc, c47);
+    source_range range = source_range::from_locations (loc, c157);
     richloc.add_fixit_remove (range);
     /* It should not have been discarded by the validator.  */
     ASSERT_EQ (1, richloc.get_num_fixit_hints ());
 
     test_diagnostic_context dc;
     ASSERT_STREQ (" foo = bar.field;\n"
-                 "       ^~~~~~~~~~                               \n"
-                 "       -----------------------------------------\n",
+                 "       ^~~~~~~~~~                               "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          \n"
+                 "       -----------------------------------------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------\n",
                  dc.test_show_locus (richloc));
   }
 
   /* Replace.  */
   {
     rich_location richloc (line_table, loc);
-    source_range range = source_range::from_locations (loc, c47);
+    source_range range = source_range::from_locations (loc, c157);
     richloc.add_fixit_replace (range, "test");
     /* It should not have been discarded by the validator.  */
     ASSERT_EQ (1, richloc.get_num_fixit_hints ());
 
     test_diagnostic_context dc;
     ASSERT_STREQ (" foo = bar.field;\n"
-                 "       ^~~~~~~~~~                               \n"
+                 "       ^~~~~~~~~~                               "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          \n"
                  "       test\n",
                  dc.test_show_locus (richloc));
   }
@@ -4552,12 +4596,12 @@ test_one_liner_fixit_validation_adhoc_locations_utf8 ()
 {
   /* Generate a range that's too long to be packed, so must
      be stored as an ad-hoc location (given the defaults
-     of 5 bits or 0 bits of packed range); 41 columns > 2**5.  */
+     of 5 bits or 7 bits or 0 bits of packed range); 150 columns > 2**7.  */
   const location_t c12 = linemap_position_for_column (line_table, 12);
-  const location_t c52 = linemap_position_for_column (line_table, 52);
-  const location_t loc = make_location (c12, c12, c52);
+  const location_t c162 = linemap_position_for_column (line_table, 162);
+  const location_t loc = make_location (c12, c12, c162);
 
-  if (c52 > LINE_MAP_MAX_LOCATION_WITH_COLS)
+  if (c162 > LINE_MAP_MAX_LOCATION_WITH_COLS)
     return;
 
   ASSERT_TRUE (IS_ADHOC_LOC (loc));
@@ -4575,7 +4619,18 @@ test_one_liner_fixit_validation_adhoc_locations_utf8 ()
                             "_bar.\xf0\x9f\x98\x82"
                                    "_field\xcf\x80"
                                           ";\n"
-                 "          ^~~~~~~~~~~~~~~~                     \n"
+                 "          ^~~~~~~~~~~~~~~~                     "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          \n"
                  "          test\n",
                dc.test_show_locus (richloc));
   }
@@ -4583,7 +4638,7 @@ test_one_liner_fixit_validation_adhoc_locations_utf8 ()
   /* Remove.  */
   {
     rich_location richloc (line_table, loc);
-    source_range range = source_range::from_locations (loc, c52);
+    source_range range = source_range::from_locations (loc, c162);
     richloc.add_fixit_remove (range);
     /* It should not have been discarded by the validator.  */
     ASSERT_EQ (1, richloc.get_num_fixit_hints ());
@@ -4594,15 +4649,37 @@ test_one_liner_fixit_validation_adhoc_locations_utf8 ()
                             "_bar.\xf0\x9f\x98\x82"
                                    "_field\xcf\x80"
                                           ";\n"
-                 "          ^~~~~~~~~~~~~~~~                     \n"
-                 "          -------------------------------------\n",
+                 "          ^~~~~~~~~~~~~~~~                     "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          \n"
+                 "          -------------------------------------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------"
+                 "----------\n",
                dc.test_show_locus (richloc));
   }
 
   /* Replace.  */
   {
     rich_location richloc (line_table, loc);
-    source_range range = source_range::from_locations (loc, c52);
+    source_range range = source_range::from_locations (loc, c162);
     richloc.add_fixit_replace (range, "test");
     /* It should not have been discarded by the validator.  */
     ASSERT_EQ (1, richloc.get_num_fixit_hints ());
@@ -4613,7 +4690,18 @@ test_one_liner_fixit_validation_adhoc_locations_utf8 ()
                             "_bar.\xf0\x9f\x98\x82"
                                    "_field\xcf\x80"
                                           ";\n"
-                 "          ^~~~~~~~~~~~~~~~                     \n"
+                 "          ^~~~~~~~~~~~~~~~                     "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          "
+                 "          \n"
                  "          test\n",
                dc.test_show_locus (richloc));
   }
diff --git a/gcc/input.cc b/gcc/input.cc
index 04462ef6f5a..1629e4aeee8 100644
--- a/gcc/input.cc
+++ b/gcc/input.cc
@@ -1271,7 +1271,7 @@ dump_line_table_statistics (void)
 /* Get location one beyond the final location in ordinary map IDX.  */
 
 static location_t
-get_end_location (class line_maps *set, unsigned int idx)
+get_end_location (class line_maps *set, line_map_uint_t idx)
 {
   if (idx == LINEMAPS_ORDINARY_USED (set) - 1)
     return set->highest_location;
@@ -1301,7 +1301,7 @@ write_digit_row (FILE *stream, int indent,
   fprintf (stream, "|");
   for (int column = 1; column < max_col; column++)
     {
-      location_t column_loc = loc + (column << map->m_range_bits);
+      location_t column_loc = loc + (location_t (column) << map->m_range_bits);
       write_digit (stream, column_loc / divisor);
     }
   fprintf (stream, "\n");
@@ -1315,8 +1315,8 @@ dump_location_range (FILE *stream,
                     location_t start, location_t end)
 {
   fprintf (stream,
-          "  location_t interval: %u <= loc < %u\n",
-          start, end);
+          "  location_t interval: %llu <= loc < %llu\n",
+          (unsigned long long) start, (unsigned long long) end);
 }
 
 /* Write a labelled description of a half-closed (START) / half-open (END)
@@ -1343,15 +1343,18 @@ dump_location_info (FILE *stream)
   dump_labelled_location_range (stream, "RESERVED LOCATIONS",
                                0, RESERVED_LOCATION_COUNT);
 
+  using ULL = unsigned long long;
+
   /* Visualize the ordinary line_map instances, rendering the sources. */
-  for (unsigned int idx = 0; idx < LINEMAPS_ORDINARY_USED (line_table); idx++)
+  for (line_map_uint_t idx = 0; idx < LINEMAPS_ORDINARY_USED (line_table);
+       idx++)
     {
       location_t end_location = get_end_location (line_table, idx);
       /* half-closed: doesn't include this one. */
 
       const line_map_ordinary *map
        = LINEMAPS_ORDINARY_MAP_AT (line_table, idx);
-      fprintf (stream, "ORDINARY MAP: %i\n", idx);
+      fprintf (stream, "ORDINARY MAP: %llu\n", (ULL) idx);
       dump_location_range (stream,
                           MAP_START_LOCATION (map), end_location);
       fprintf (stream, "  file: %s\n", ORDINARY_MAP_FILE_NAME (map));
@@ -1387,18 +1390,18 @@ dump_location_info (FILE *stream)
 
       const line_map_ordinary *includer_map
        = linemap_included_from_linemap (line_table, map);
-      fprintf (stream, "  included from location: %d",
-              linemap_included_from (map));
+      fprintf (stream, "  included from location: %llu",
+              (ULL) linemap_included_from (map));
       if (includer_map) {
-       fprintf (stream, " (in ordinary map %d)",
-                int (includer_map - line_table->info_ordinary.maps));
+       fprintf (stream, " (in ordinary map %llu)",
+                ULL (includer_map - line_table->info_ordinary.maps));
       }
       fprintf (stream, "\n");
 
       /* Render the span of source lines that this "map" covers.  */
       for (location_t loc = MAP_START_LOCATION (map);
           loc < end_location;
-          loc += (1 << map->m_range_bits) )
+          loc += (location_t (1) << map->m_range_bits))
        {
          gcc_assert (pure_location_p (line_table, loc) );
 
@@ -1414,16 +1417,16 @@ dump_location_info (FILE *stream)
              if (!line_text)
                break;
              fprintf (stream,
-                      "%s:%3i|loc:%5i|%.*s\n",
+                      "%s:%3i|loc:%5llu|%.*s\n",
                       exploc.file, exploc.line,
-                      loc,
+                      (ULL) loc,
                       (int)line_text.length (), line_text.get_buffer ());
 
              /* "loc" is at column 0, which means "the whole line".
                 Render the locations *within* the line, by underlining
                 it, showing the location_t numeric values
                 at each column.  */
-             size_t max_col = (1 << map->m_column_and_range_bits) - 1;
+             auto max_col = (ULL (1) << map->m_column_and_range_bits) - 1;
              if (max_col > line_text.length ())
                max_col = line_text.length () + 1;
 
@@ -1460,19 +1463,19 @@ dump_location_info (FILE *stream)
                                LINEMAPS_MACRO_LOWEST_LOCATION (line_table));
 
   /* Visualize the macro line_map instances, rendering the sources. */
-  for (unsigned int i = 0; i < LINEMAPS_MACRO_USED (line_table); i++)
+  for (line_map_uint_t i = 0; i < LINEMAPS_MACRO_USED (line_table); i++)
     {
       /* Each macro map that is allocated owns location_t values
         that are *lower* that the one before them.
         Hence it's meaningful to view them either in order of ascending
         source locations, or in order of ascending macro map index.  */
       const bool ascending_location_ts = true;
-      unsigned int idx = (ascending_location_ts
-                         ? (LINEMAPS_MACRO_USED (line_table) - (i + 1))
-                         : i);
+      auto idx = (ascending_location_ts
+                 ? (LINEMAPS_MACRO_USED (line_table) - (i + 1))
+                 : i);
       const line_map_macro *map = LINEMAPS_MACRO_MAP_AT (line_table, idx);
-      fprintf (stream, "MACRO %i: %s (%u tokens)\n",
-              idx,
+      fprintf (stream, "MACRO %llu: %s (%u tokens)\n",
+              (ULL) idx,
               linemap_map_get_macro_name (map),
               MACRO_MAP_NUM_MACRO_TOKENS (map));
       dump_location_range (stream,
@@ -1480,10 +1483,10 @@ dump_location_info (FILE *stream)
                           (map->start_location
                            + MACRO_MAP_NUM_MACRO_TOKENS (map)));
       inform (map->get_expansion_point_location (),
-             "expansion point is location %i",
-             map->get_expansion_point_location ());
-      fprintf (stream, "  map->start_location: %u\n",
-              map->start_location);
+             "expansion point is location %llu",
+             (ULL) map->get_expansion_point_location ());
+      fprintf (stream, "  map->start_location: %llu\n",
+              (ULL) map->start_location);
 
       fprintf (stream, "  macro_locations:\n");
       for (unsigned int i = 0; i < MACRO_MAP_NUM_MACRO_TOKENS (map); i++)
@@ -1503,24 +1506,26 @@ dump_location_info (FILE *stream)
             This would explain there being up to 4 location_ts slots
             that may be uninitialized.  */
 
-         fprintf (stream, "    %u: %u, %u\n",
+         fprintf (stream, "    %u: %llu, %llu\n",
                   i,
-                  x,
-                  y);
+                  (ULL) x,
+                  (ULL) y);
          if (x == y)
            {
              if (x < MAP_START_LOCATION (map))
-               inform (x, "token %u has %<x-location == y-location == %u%>",
-                       i, x);
+               inform (x, "token %u has %<x-location == y-location == %llu%>",
+                       i, (ULL) x);
              else
                fprintf (stream,
-                        "x-location == y-location == %u encodes token # %u\n",
-                        x, x - MAP_START_LOCATION (map));
-               }
+                        "x-location == y-location == %llu"
+                        " encodes token # %u\n",
+                        (ULL) x,
+                        (unsigned int)(x - MAP_START_LOCATION (map)));
+           }
          else
            {
-             inform (x, "token %u has %<x-location == %u%>", i, x);
-             inform (x, "token %u has %<y-location == %u%>", i, y);
+             inform (x, "token %u has %<x-location == %llu%>", i, (ULL) x);
+             inform (x, "token %u has %<y-location == %llu%>", i, (ULL) y);
            }
        }
       fprintf (stream, "\n");
@@ -1536,7 +1541,7 @@ dump_location_info (FILE *stream)
 
   /* Visualize ad-hoc values.  */
   dump_labelled_location_range (stream, "AD-HOC LOCATIONS",
-                               MAX_LOCATION_T + 1, UINT_MAX);
+                               MAX_LOCATION_T + 1, location_t (-1));
 }
 
 /* string_concat's constructor.  */
@@ -2036,13 +2041,13 @@ assert_loceq (const char *exp_filename, int 
exp_linenum, int exp_colnum,
 class line_table_case
 {
 public:
-  line_table_case (int default_range_bits, int base_location)
+  line_table_case (int default_range_bits, location_t base_location)
   : m_default_range_bits (default_range_bits),
     m_base_location (base_location)
   {}
 
   int m_default_range_bits;
-  int m_base_location;
+  location_t m_base_location;
 };
 
 /* Constructor.  Store the old value of line_table, and create a new
@@ -2132,9 +2137,9 @@ test_accessing_ordinary_linemaps (const line_table_case 
&case_)
   location_t loc_start_of_very_long_line
     = linemap_position_for_column (line_table, 2000);
   location_t loc_too_wide
-    = linemap_position_for_column (line_table, 4097);
+    = linemap_position_for_column (line_table, LINE_MAP_MAX_COLUMN_NUMBER + 1);
   location_t loc_too_wide_2
-    = linemap_position_for_column (line_table, 4098);
+    = linemap_position_for_column (line_table, LINE_MAP_MAX_COLUMN_NUMBER + 2);
 
   /* ...and back to a sane line length.  */
   linemap_line_start (line_table, 6, 100);
@@ -3865,11 +3870,11 @@ static const location_t boundary_locations[] = {
   LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES + 0x100,
 
   /* Values near LINE_MAP_MAX_LOCATION_WITH_COLS.  */
-  LINE_MAP_MAX_LOCATION_WITH_COLS - 0x100,
+  LINE_MAP_MAX_LOCATION_WITH_COLS - 0x200,
   LINE_MAP_MAX_LOCATION_WITH_COLS - 1,
   LINE_MAP_MAX_LOCATION_WITH_COLS,
   LINE_MAP_MAX_LOCATION_WITH_COLS + 1,
-  LINE_MAP_MAX_LOCATION_WITH_COLS + 0x100,
+  LINE_MAP_MAX_LOCATION_WITH_COLS + 0x200,
 };
 
 /* Run TESTCASE multiple times, once for each case in our test matrix.  */
@@ -3884,10 +3889,9 @@ for_each_line_table_case (void (*testcase) (const 
line_table_case &))
 
   /* Run all tests with:
      (a) line_table->default_range_bits == 0, and
-     (b) line_table->default_range_bits == 5.  */
-  int num_cases_tested = 0;
-  for (int default_range_bits = 0; default_range_bits <= 5;
-       default_range_bits += 5)
+     (b) line_table->default_range_bits == line_map_suggested_range_bits.  */
+
+  for (int default_range_bits: {0, line_map_suggested_range_bits})
     {
       /* ...and use each of the "interesting" location values as
         the starting location within line_table.  */
@@ -3895,15 +3899,9 @@ for_each_line_table_case (void (*testcase) (const 
line_table_case &))
       for (int loc_idx = 0; loc_idx < num_boundary_locations; loc_idx++)
        {
          line_table_case c (default_range_bits, boundary_locations[loc_idx]);
-
          testcase (c);
-
-         num_cases_tested++;
        }
     }
-
-  /* Verify that we fully covered the test matrix.  */
-  ASSERT_EQ (num_cases_tested, 2 * 12);
 }
 
 /* Verify that when presented with a consecutive pair of locations with

Reply via email to