]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
d: Fix ICE: in output_constructor_regular_field, at varasm.cc:5500 [PR123798]
authorIain Buclaw <ibuclaw@gdcproject.org>
Wed, 28 Jan 2026 21:09:37 +0000 (22:09 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Wed, 28 Jan 2026 21:35:31 +0000 (22:35 +0100)
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
gcc/testsuite/gdc.dg/pr123798.d [new file with mode: 0644]

index 81b42b4615f9c803d28543eb76aae94533e2555c..e6f1bcbb9047f500d2ba3c170a754740ba542dfc 100644 (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))
diff --git a/gcc/testsuite/gdc.dg/pr123798.d b/gcc/testsuite/gdc.dg/pr123798.d
new file mode 100644 (file)
index 0000000..92f8c2d
--- /dev/null
@@ -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;
+}