diff --git a/gcc/testsuite/g++.dg/diagnostic/pr72803.C b/gcc/testsuite/g++.dg/diagnostic/pr72803.C index 0a9a390b9c3..ca522b74bad 100644 --- a/gcc/testsuite/g++.dg/diagnostic/pr72803.C +++ b/gcc/testsuite/g++.dg/diagnostic/pr72803.C @@ -5,5 +5,6 @@ class test { // The line directive appears to be necessary to trigger the ICE // { dg-error "style of line directive is a GCC extension" "" { target *-*-* } .-2 } -/* Verify that we get the correct line and column for the diagnostic. */ -// { dg-error "512: expected .;. after class definition" "" { target *-*-* } 3 } +/* Verify that we get the best line and column for the diagnostic. + 512 is not representable in the line-maps created for this test. */ +// { dg-error "511: expected .;. after class definition" "" { target *-*-* } 3 } diff --git a/libcpp/line-map.c b/libcpp/line-map.c index 1bf0e8211f2..2f5e44447d2 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -981,16 +981,15 @@ linemap_position_for_loc_and_offset (line_maps *set, (loc + offset) should be less than the first location encoded by 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 + (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 - location there. */ - if (line < ORDINARY_MAP_STARTING_LINE_NUMBER (map)) - return loc; - } + for (; map != LINEMAPS_LAST_ORDINARY_MAP (set) + && (loc + (column << map->m_range_bits) + >= MAP_START_LOCATION (map + 1)); map++) + /* If the next map is a different file, or starts in a higher line, we + cannot encode the location there. */ + if ((map + 1)->reason != LC_RENAME + || line < ORDINARY_MAP_STARTING_LINE_NUMBER (map + 1) + || 0 != strcmp (LINEMAP_FILE (map + 1), LINEMAP_FILE (map))) + return loc; column += column_offset;