]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
d: Fix ICE: in expand_asm_stmt, at cfgexpand.cc:3445 [PR121477]
authorIain Buclaw <ibuclaw@gdcproject.org>
Wed, 28 Jan 2026 17:34:21 +0000 (18:34 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Wed, 28 Jan 2026 17:41:27 +0000 (18:41 +0100)
The d_mark_addressable routine that sets TREE_ADDRESSABLE in the D
front-end did not handle DECL_BIT_FIELD.

PR d/121477

gcc/d/ChangeLog:

* d-codegen.cc (d_mark_addressable): Give an error if taking the
address of a DECL_BIT_FIELD.

gcc/testsuite/ChangeLog:

* gdc.dg/pr121477.d: New test.

gcc/d/d-codegen.cc
gcc/testsuite/gdc.dg/pr121477.d [new file with mode: 0644]

index 716fa447eba14014787df37a4404da410a9c3b2d..9ec23546b4add10be0c7e01853777c36b8ce64bb 100644 (file)
@@ -745,8 +745,12 @@ d_mark_addressable (tree exp, bool complain)
 {
   switch (TREE_CODE (exp))
     {
-    case ADDR_EXPR:
     case COMPONENT_REF:
+      if (complain && DECL_BIT_FIELD (TREE_OPERAND (exp, 1)))
+       error ("cannot take address of bit-field %qD", TREE_OPERAND (exp, 1));
+
+      /* Fall through.  */
+    case ADDR_EXPR:
     case ARRAY_REF:
     case REALPART_EXPR:
     case IMAGPART_EXPR:
diff --git a/gcc/testsuite/gdc.dg/pr121477.d b/gcc/testsuite/gdc.dg/pr121477.d
new file mode 100644 (file)
index 0000000..3f5bc35
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-additional-options "-fpreview=bitfields" }
+struct S121477
+{
+    int x : 4;
+}
+
+void f121477(S121477 s)
+{
+    asm {"%0" :: "m" (s.x); } // { dg-error "cannot take address of bit-field" }
+    asm {"%0" : "=m" (s.x); } // { dg-error "cannot take address of bit-field" }
+}