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:
Iain Buclaw
2026-01-28 22:09:37 +01:00
parent b20e68022a
commit a1adc5aa30
2 changed files with 23 additions and 1 deletions

View File

@@ -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))

View 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;
}