https://gcc.gnu.org/g:e49b8f2a46d1baaee01c9924b3cc9b66c9e5f6d3
commit r15-10742-ge49b8f2a46d1baaee01c9924b3cc9b66c9e5f6d3 Author: Iain Buclaw <[email protected]> Date: Wed Jan 28 18:34:21 2026 +0100 d: Fix ICE: in expand_asm_stmt, at cfgexpand.cc:3445 [PR121477] 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. (cherry picked from commit baaa412ae73c12e2e5ea2552534ec42525f6d21e) Diff: --- gcc/d/d-codegen.cc | 6 +++++- gcc/testsuite/gdc.dg/pr121477.d | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/d/d-codegen.cc b/gcc/d/d-codegen.cc index 1a7575aac22c..4b72a2bd08f7 100644 --- a/gcc/d/d-codegen.cc +++ b/gcc/d/d-codegen.cc @@ -744,8 +744,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 000000000000..3f5bc359272e --- /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" } +}
