aboutsummaryrefslogtreecommitdiff
path: root/gcc/stor-layout.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-06-24 12:22:14 +0200
committerJakub Jelinek <jakub@redhat.com>2021-06-24 12:22:14 +0200
commit65371066d8967560e3508af4a804e0ddb90acee7 (patch)
treec26de24e5ec65d7fcdbcf6ca720a3bab9e0c9ae7 /gcc/stor-layout.c
parenta1c1b7a888ade6f21bc7c7f05a2cbff290273fcc (diff)
downloadgcc-65371066d8967560e3508af4a804e0ddb90acee7.zip
gcc-65371066d8967560e3508af4a804e0ddb90acee7.tar.gz
gcc-65371066d8967560e3508af4a804e0ddb90acee7.tar.bz2
stor-layout: Avoid DECL_BIT_FIELD_REPRESENTATIVE with NULL TREE_TYPE [PR101172]
finish_bitfield_representative has an early out if the field after a bitfield has error_mark_node type, but that early out leads to TREE_TYPE of the DECL_BIT_FIELD_REPRESENTATIVE being NULL, which breaks assumptions on code that uses the DECL_BIT_FIELD_REPRESENTATIVE during error-recovery. The following patch instead sets TREE_TYPE of the representative to error_mark_node, something the users can deal with better. At this point the representative can be set as DECL_BIT_FIELD_REPRESENTATIVE for multiple bitfields, so making sure that we clear the DECL_BIT_FIELD_REPRESENTATIVE instead would be harder (but doable, e.g. with the error_mark_node TREE_TYPE set by this patch set some flag in the caller and if the flag is there, walk all the fields once again and clear all DECL_BIT_FIELD_REPRESENTATIVE that have error_mark_node TREE_TYPE). 2021-06-24 Jakub Jelinek <jakub@redhat.com> PR middle-end/101172 * stor-layout.c (finish_bitfield_representative): If nextf has error_mark_node type, set repr type to error_mark_node too. * gcc.dg/pr101172.c: New test.
Diffstat (limited to 'gcc/stor-layout.c')
-rw-r--r--gcc/stor-layout.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 9f850c3..242452f 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -2086,7 +2086,10 @@ finish_bitfield_representative (tree repr, tree field)
/* If there was an error, the field may be not laid out
correctly. Don't bother to do anything. */
if (TREE_TYPE (nextf) == error_mark_node)
- return;
+ {
+ TREE_TYPE (repr) = error_mark_node;
+ return;
+ }
maxsize = size_diffop (DECL_FIELD_OFFSET (nextf),
DECL_FIELD_OFFSET (repr));
if (tree_fits_uhwi_p (maxsize))