Hi,

This patch fixes an ICE in output_constructor_regular_field when mixing
default initializers and bit-fields in the same struct.

The D front-end missed a few details when constructing bit-fields,
leading them to be incorrectly handled by the middle-end.

Regstrapped on x86_64-linux-gnu, committed to mainline, and backported
to releases/gcc-13, gcc-14, and gcc-15.

Regards,
Iain.

---
        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.
---
 gcc/d/types.cc                  | 10 +++++++++-
 gcc/testsuite/gdc.dg/pr123798.d | 14 ++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gdc.dg/pr123798.d

diff --git a/gcc/d/types.cc b/gcc/d/types.cc
index 81b42b4615f..e6f1bcbb904 100644
--- a/gcc/d/types.cc
+++ b/gcc/d/types.cc
@@ -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))
diff --git a/gcc/testsuite/gdc.dg/pr123798.d b/gcc/testsuite/gdc.dg/pr123798.d
new file mode 100644
index 00000000000..92f8c2daec1
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr123798.d
@@ -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;
+}
-- 
2.43.0

Reply via email to