[PATCH] C: PR c/79412: Poison decls with error_mark_node after type mismatch

Roger Sayle roger@nextmovesoftware.com
Tue Aug 31 10:10:55 GMT 2021

This patch fixes an ICE during error-recovery regression in the C front-end.
The symptom is that the middle-end's sanity checking assertions fail during
gimplification when being asked to increment an array, which is non-sense.
The issue is that the C-front end has detected the type mismatch and
reported an error to the user, but hasn't provided any indication of this
to the middle-end, simply passing bogus trees that the optimizers recognize
as invalid.

This appears to be a frequently reported ICE with 94730, 94731, 101036
and 101365 all marked as duplicates.

I believe the correct (polite) fix is to mark the mismatched types as
problematic/dubious in the front-end, when the error is spotted, so that
the middle-end has a heads-up and can be a little more forgiving.  This
patch to c-decl.c's duplicate_decls sets (both) mismatched types to
error_mark_node if they are significantly different, and we've issued
an error message.  Alas, this is too punitive for FUNCTION_DECLs where
we store return types, parameter lists, parameter types and attributes
in the type, but fortunately the middle-end is already more cautious
about trusting possibly suspect function types.

This fix required one minor change to the testsuite, typedef-var-2.c
where after conflicting type definitions, we now no longer assume that
the (first or) second definition is the correct one.  This change only
affects the behaviour after seen_error(), so should be relatively safe.

This patch has been tested on x86_64-pc-linux-gnu with "make bootstrap"
and "make -k check" with no new failures.  Ok for mainline?

2020-08-31  Roger Sayle  <roger@nextmovesoftware.com>

	PR c/79412
	* c-decl.c (duplicate_decls): On significant mismatches, mark the
	types of both (non-function) decls as error_mark_node, so that the
	middle-end can see the code is malformed.
	(free_attr_access_data): Don't process if the type has been set to

	PR c/79412
	* gcc.dg/pr79412.c: New test case.
	* gcc.dg/typedef-var-2.c: Update expeted errors.


-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patchw2c.txt
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20210831/a8384af3/attachment-0001.txt>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: pr79412.c
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20210831/a8384af3/attachment-0001.c>

More information about the Gcc-patches mailing list