]> git.ipfire.org Git - thirdparty/gcc.git/commit
diagnostics: fix ICE on fix-it hints on very long lines [PR99323]
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 2 Mar 2021 20:46:06 +0000 (15:46 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Tue, 2 Mar 2021 20:46:06 +0000 (15:46 -0500)
commit41fbacdd10305654b1d10f887fa3f4677f9b8f34
tree14f8aedff14c4fb3cb19cc7a922d12d79272eb2a
parente7ca37649e4f322e7512c6d11813992c61b0a4b3
diagnostics: fix ICE on fix-it hints on very long lines [PR99323]

PR c/99323 describes an ICE due to a failed assertion deep inside the
fix-it printing machinery, where the fix-it hints on one line have not
been properly sorted in layout's constructor.

The underlying issue occurs when multiple fix-it hints affect a line
wider that LINE_MAP_MAX_COLUMN_NUMBER, where the location_t values for
characters after that threshold fall back to having column zero.

It's not meaningful to try to handle fix-it hints without column
information, so this patch rejects them as they are added to the
rich_location, falling back to the "no fix-it hints on this diagnostic"
case, fixing the crash.

gcc/ChangeLog:
PR c/99323
* diagnostic-show-locus.c
(selftest::test_one_liner_many_fixits_2): Fix accidental usage of
column 0.

gcc/testsuite/ChangeLog:
PR c/99323
* gcc.dg/pr99323-1.c: New test.
* gcc.dg/pr99323-2.c: New test.

libcpp/ChangeLog:
PR c/99323
* line-map.c (rich_location::maybe_add_fixit): Reject fix-it hints
at column 0.
gcc/diagnostic-show-locus.c
gcc/testsuite/gcc.dg/pr99323-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr99323-2.c [new file with mode: 0644]
libcpp/line-map.c