https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96391

--- Comment #20 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by David Malcolm <dmalc...@gcc.gnu.org>:

https://gcc.gnu.org/g:1f5c80883efce5242d892eb771ebb60830d20e0f

commit r11-7179-g1f5c80883efce5242d892eb771ebb60830d20e0f
Author: David Malcolm <dmalc...@redhat.com>
Date:   Wed Feb 10 14:33:10 2021 -0500

    libcpp: fix ICE comparing macro locations without column info [PR96391]

    PR preprocessor/96391 describes an ICE in the C++ frontend on:

      #define CONST const
      #define VOID void
      typedef CONST VOID *PCVOID;

    where the typedef line occurs after enough code has been compiled
    that location_t values are beyond LINE_MAP_MAX_LOCATION_WITH_COLS,
    and hence no column numbers are available.

    The issue occurs in linemap_compare_locations when comparing the
    locations of the "const" and "void" tokens.
    Upon resolving the LRK_MACRO_EXPANSION_POINT, both have the same
    location_t, the line of the "typedef" (with no column), and so
    the l0 == l1 clause is triggered, but they are not from the
    same macro expansion, leading first_map_in_common to return NULL
    and triggering the "abort" condition.

    This patch fixes the issue by checking when the two macro expansion
    point location_t values are equal that the value
    <= LINE_MAP_MAX_LOCATION_WITH_COLS and thus has column information,
    fixing the issue.

    gcc/testsuite/ChangeLog:
            PR preprocessor/96391
            * g++.dg/plugin/location-overflow-test-pr96391.c: New test.
            * g++.dg/plugin/plugin.exp (plugin_test_list): Add it,
            using the location_overflow_plugin.c from gcc.dg/plugin.

    libcpp/ChangeLog:
            PR preprocessor/96391
            * line-map.c (linemap_compare_locations): Require that
            the location be <= LINE_MAP_MAX_LOCATION_WITH_COLS when
            treating locations as coming from the same macro expansion.

Reply via email to