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

--- Comment #6 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Author: dmalcolm
Date: Fri Nov 30 15:57:37 2018
New Revision: 266671

URL: https://gcc.gnu.org/viewcvs?rev=266671&root=gcc&view=rev
Log:
Fix ICE in substring locations from macros in header files (PR
preprocessor/88257)

PR preprocessor/88257 reports an ICE on gcc.dg/format/pr78304.c
when compiled using g++:

void test (const char *msg)
{
  printf ("size: %" PRIu32 "\n", msg);
}

due to mismatching files (and line maps) between
linemap_resolve_location and expand_location_to_spelling_point
when PRIu32 is defined in a system header.

The root cause is that expand_location_to_spelling_point stops
unwinding locations when it reaches a system header, whereas
linemap_resolve_location can resolve into a system header,
which can lead to locations within get_substring_ranges_for_loc
getting out of sync, and using the wrong line map.

This patch fixes the issue by checking that the files are the
same.

gcc/ChangeLog:
        PR preprocessor/88257
        * input.c (get_substring_ranges_for_loc): Fix indentation.
        Bulletproof against getting a different files back from
        linemap_resolve_location and expand_location_to_spelling_point.

gcc/testsuite/ChangeLog:
        PR preprocessor/88257
        * c-c++-common/Wformat-pr88257.c: New test.
        * c-c++-common/Wformat-pr88257.h: New test header.
        * c-c++-common/empty.h: New test header.


Added:
    trunk/gcc/testsuite/c-c++-common/Wformat-pr88257.c
    trunk/gcc/testsuite/c-c++-common/Wformat-pr88257.h
    trunk/gcc/testsuite/c-c++-common/empty.h
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/input.c
    trunk/gcc/testsuite/ChangeLog

Reply via email to