https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94311

--- Comment #16 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
One possible way at the libcpp side is to make sure we don't deplete the
location_t stuff too much once we are above highest >
LINE_MAP_MAX_LOCATION_WITH_COLS.  I mean, the comment above this if block says:
      /* Allocate the new line_map.  However, if the current map only has a
         single line we can sometimes just increase its column_bits instead. */
and with these > 0x60000000 locations, column_bits and range_bits is 0 anyway
and in that case we are not going to increase its column_bits.
Now, I've bootstrapped a slightly different version overnight, which instead
had || column_bits == 0, and that regressed the g++.dg/diagnostic/pr77949.C
testcase which has a 4KB+ line and thus disables columns and expects no fixit
hint.  Or perhaps use || (highest > ... && (to_line -
ORDINARY_MAP_STARTING_LINE_NUMBER (map)) > 100) or something similar, allow
some growth, but not unlimited?  David, your thoughts on this?

2020-09-02  Jakub Jelinek  <ja...@redhat.com>

        PR lto/94311
        * line-map.c (linemap_line_start): For single-line map don't try
        to extend it if highest > LINE_MAP_MAX_LOCATION_WITH_COLS.

--- libcpp/line-map.c.jj        2020-07-28 15:39:10.127754591 +0200
+++ libcpp/line-map.c   2020-09-02 11:08:50.421816848 +0200
@@ -742,7 +742,8 @@ linemap_line_start (line_maps *set, line
              (to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
              >= (((uint64_t) 1)
                  << (CHAR_BIT * sizeof (linenum_type) - column_bits)))
-         || range_bits < map->m_range_bits)
+         || range_bits < map->m_range_bits
+         || highest > LINE_MAP_MAX_LOCATION_WITH_COLS)
        map = linemap_check_ordinary
                (const_cast <line_map *>
                  (linemap_add (set, LC_RENAME,

Reply via email to