mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 03:46:53 -05:00
d: Fix ICE: in output_constructor_regular_field, at varasm.cc:5500 [PR123798]
PR d/123798 gcc/d/ChangeLog: * types.cc (insert_aggregate_bitfield): Set DECL_NONADDRESSABLE_P and DECL_PADDING_P on bit-field decls. (finish_aggregate_type): Pass the aligned bit offset to layout_decl. gcc/testsuite/ChangeLog: * gdc.dg/pr123798.d: New test.
This commit is contained in:
@@ -324,6 +324,10 @@ insert_aggregate_bitfield (tree type, tree bitfield, size_t width,
|
||||
DECL_BIT_FIELD (bitfield) = 1;
|
||||
DECL_BIT_FIELD_TYPE (bitfield) = TREE_TYPE (bitfield);
|
||||
|
||||
DECL_NONADDRESSABLE_P (bitfield) = 1;
|
||||
if (DECL_NAME (bitfield) == NULL_TREE)
|
||||
DECL_PADDING_P (bitfield) = 1;
|
||||
|
||||
TYPE_FIELDS (type) = chainon (TYPE_FIELDS (type), bitfield);
|
||||
}
|
||||
|
||||
@@ -671,7 +675,11 @@ finish_aggregate_type (unsigned structsize, unsigned alignsize, tree type)
|
||||
continue;
|
||||
}
|
||||
|
||||
layout_decl (field, 0);
|
||||
/* Layout the field decl using its known alignment. */
|
||||
unsigned int known_align =
|
||||
least_bit_hwi (tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field)));
|
||||
|
||||
layout_decl (field, known_align);
|
||||
|
||||
/* Give bit-field its proper type after layout_decl. */
|
||||
if (DECL_BIT_FIELD (field))
|
||||
|
||||
14
gcc/testsuite/gdc.dg/pr123798.d
Normal file
14
gcc/testsuite/gdc.dg/pr123798.d
Normal file
@@ -0,0 +1,14 @@
|
||||
// { dg-do compile }
|
||||
// { dg-additional-options "-fpreview=bitfields" }
|
||||
class C123798
|
||||
{
|
||||
int a : 4;
|
||||
long b : 8;
|
||||
}
|
||||
|
||||
struct S123798
|
||||
{
|
||||
int a = 1;
|
||||
int b : 4;
|
||||
long c : 8;
|
||||
}
|
||||
Reference in New Issue
Block a user