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
This commit is contained in:
David Malcolm 2016-03-01 01:02:49 +00:00 committed by David Malcolm
parent f3c7a94580
commit 7168133a37
4 changed files with 30 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2016-02-29 David Malcolm <dmalcolm@redhat.com>
PR preprocessor/69985
* gcc.dg/cpp/pr69985.c: New test case.
2016-02-29 Jeff Law <law@redhat.com>
PR tree-optimization/70005

View File

@ -0,0 +1,7 @@
/* { dg-options "-Wformat" } */
extern int printf (const char *__restrict __format, ...);
void test (void)
{
/* A very long line, so that we start a new line map. */
printf ("%llu01233456789012334567890123345678901233456789012334567890123345678901233456789012334567890123345678901233456789012334567890123345678901233456789"); /* { dg-warning "15: format .%llu. expects a matching" } */
}

View File

@ -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

View File

@ -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;