diff options
author | David Malcolm <dmalcolm@redhat.com> | 2016-03-01 01:02:49 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2016-03-01 01:02:49 +0000 |
commit | 7168133a372e15373f3687d9b5e01ce24a954de9 (patch) | |
tree | 24b174cddca2c8a46a928dffe42c5c6b0c8718a4 /libcpp | |
parent | f3c7a94580c1ca9d78bc246be19750ebd047124f (diff) | |
download | gcc-7168133a372e15373f3687d9b5e01ce24a954de9.zip gcc-7168133a372e15373f3687d9b5e01ce24a954de9.tar.gz gcc-7168133a372e15373f3687d9b5e01ce24a954de9.tar.bz2 |
PR preprocessor/69985: fix ICE with long lines in -Wformat
gcc/testsuite/ChangeLog:
PR preprocessor/69985
* gcc.dg/cpp/pr69985.c: New test case.
libcpp/ChangeLog:
PR preprocessor/69985
(linemap_position_for_loc_and_offset): Rename param from "offset"
to "column_offset". Right-shift the column_offset by m_range_bits
of the pertinent ordinary map whenever offsetting a
source_location. For clarity, offset the column by the column
offset, rather than the other way around.
From-SVN: r233836
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/ChangeLog | 9 | ||||
-rw-r--r-- | libcpp/line-map.c | 17 |
2 files changed, 18 insertions, 8 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 1dfcf8d..676272d 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,12 @@ +2016-02-29 David Malcolm <dmalcolm@redhat.com> + + PR preprocessor/69985 + (linemap_position_for_loc_and_offset): Rename param from "offset" + to "column_offset". Right-shift the column_offset by m_range_bits + of the pertinent ordinary map whenever offsetting a + source_location. For clarity, offset the column by the column + offset, rather than the other way around. + 2016-02-23 David Malcolm <dmalcolm@redhat.com> PR preprocessor/69126 diff --git a/libcpp/line-map.c b/libcpp/line-map.c index c05a001..264ae20 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -864,13 +864,13 @@ linemap_position_for_line_and_column (line_maps *set, } /* Encode and return a source_location starting from location LOC and - shifting it by OFFSET columns. This function does not support + shifting it by COLUMN_OFFSET columns. This function does not support virtual locations. */ source_location linemap_position_for_loc_and_offset (struct line_maps *set, source_location loc, - unsigned int offset) + unsigned int column_offset) { const line_map_ordinary * map = NULL; @@ -882,7 +882,7 @@ linemap_position_for_loc_and_offset (struct line_maps *set, (!linemap_location_from_macro_expansion_p (set, loc))) return loc; - if (offset == 0 + if (column_offset == 0 /* Adding an offset to a reserved location (like UNKNOWN_LOCATION for the C/C++ FEs) does not really make sense. So let's leave the location intact in that case. */ @@ -894,7 +894,7 @@ linemap_position_for_loc_and_offset (struct line_maps *set, /* The new location (loc + offset) should be higher than the first location encoded by MAP. This can fail if the line information is messed up because of line directives (see PR66415). */ - if (MAP_START_LOCATION (map) >= loc + offset) + if (MAP_START_LOCATION (map) >= loc + (column_offset << map->m_range_bits)) return loc; linenum_type line = SOURCE_LINE (map, loc); @@ -905,7 +905,8 @@ linemap_position_for_loc_and_offset (struct line_maps *set, the next line map of the set. Otherwise, we try to encode the location in the next map. */ while (map != LINEMAPS_LAST_ORDINARY_MAP (set) - && loc + offset >= MAP_START_LOCATION (&map[1])) + && (loc + (column_offset << map->m_range_bits) + >= MAP_START_LOCATION (&map[1]))) { map = &map[1]; /* If the next map starts in a higher line, we cannot encode the @@ -914,12 +915,12 @@ linemap_position_for_loc_and_offset (struct line_maps *set, return loc; } - offset += column; - if (linemap_assert_fails (offset < (1u << map->m_column_and_range_bits))) + column += column_offset; + if (linemap_assert_fails (column < (1u << map->m_column_and_range_bits))) return loc; source_location r = - linemap_position_for_line_and_column (set, map, line, offset); + linemap_position_for_line_and_column (set, map, line, column); if (linemap_assert_fails (r <= set->highest_location) || linemap_assert_fails (map == linemap_lookup (set, r))) return loc; |