Hi,
This patch fixes an ICE when taking the address of a bit-field inside an
inline assembler statement. The d_mark_addressable routine that sets
TREE_ADDRESSABLE in the D front-end did not handle DECL_BIT_FIELD.
Regstrapped on x86_64-linux-gnu, committed to mainline, and backported
to releases/gcc-13, gcc-14, and gcc-15.
Regards,
Iain.
---
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 | 6 +++++-
gcc/testsuite/gdc.dg/pr121477.d | 12 ++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gdc.dg/pr121477.d
diff --git a/gcc/d/d-codegen.cc b/gcc/d/d-codegen.cc
index 716fa447eba..9ec23546b4a 100644
--- a/gcc/d/d-codegen.cc
+++ b/gcc/d/d-codegen.cc
@@ -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
index 00000000000..3f5bc359272
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr121477.d
@@ -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"
}
+}
--
2.43.0