preprocessor: Fix column adjustment [PR 99446]

This ICE was because when adjusting a column offset we could advance
into a linemap for a different file.  We only checked the next line
map was not for a line further advanced in any file, forgetting that
it could be for an earlier line in a different file.  The testcase
needed adjusting as column 512 was unrepresentable, once that was
taken into consideration.

	PR preprocessor/99446
	libcpp/
	* line-map.c (line-map.c): Do not advance to linemaps for
	different files.
	gcc/testsuite/
	* g++.dg/diagnostic/pr72803.C: Adjust expected column.
This commit is contained in:
Nathan Sidwell 2021-04-13 05:03:19 -07:00
parent f6ba5d039f
commit 4acb3af366
2 changed files with 12 additions and 12 deletions

View File

@ -5,5 +5,6 @@ class test {
// The line directive appears to be necessary to trigger the ICE // The line directive appears to be necessary to trigger the ICE
// { dg-error "style of line directive is a GCC extension" "" { target *-*-* } .-2 } // { dg-error "style of line directive is a GCC extension" "" { target *-*-* } .-2 }
/* Verify that we get the correct line and column for the diagnostic. */ /* Verify that we get the best line and column for the diagnostic.
// { dg-error "512: expected .;. after class definition" "" { target *-*-* } 3 } 512 is not representable in the line-maps created for this test. */
// { dg-error "511: expected .;. after class definition" "" { target *-*-* } 3 }

View File

@ -981,16 +981,15 @@ linemap_position_for_loc_and_offset (line_maps *set,
(loc + offset) should be less than the first location encoded by (loc + offset) should be less than the first location encoded by
the next line map of the set. Otherwise, we try to encode the the next line map of the set. Otherwise, we try to encode the
location in the next map. */ location in the next map. */
while (map != LINEMAPS_LAST_ORDINARY_MAP (set) for (; map != LINEMAPS_LAST_ORDINARY_MAP (set)
&& (loc + (column_offset << map->m_range_bits) && (loc + (column << map->m_range_bits)
>= MAP_START_LOCATION (&map[1]))) >= MAP_START_LOCATION (map + 1)); map++)
{ /* If the next map is a different file, or starts in a higher line, we
map = &map[1]; cannot encode the location there. */
/* If the next map starts in a higher line, we cannot encode the if ((map + 1)->reason != LC_RENAME
location there. */ || line < ORDINARY_MAP_STARTING_LINE_NUMBER (map + 1)
if (line < ORDINARY_MAP_STARTING_LINE_NUMBER (map)) || 0 != strcmp (LINEMAP_FILE (map + 1), LINEMAP_FILE (map)))
return loc; return loc;
}
column += column_offset; column += column_offset;