aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2016-03-01 01:02:49 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2016-03-01 01:02:49 +0000
commit7168133a372e15373f3687d9b5e01ce24a954de9 (patch)
tree24b174cddca2c8a46a928dffe42c5c6b0c8718a4 /libcpp
parentf3c7a94580c1ca9d78bc246be19750ebd047124f (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--libcpp/line-map.c17
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;