https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100785
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ebotcazou at gcc dot gnu.org --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- In particular it is the + * c-typeck.c (build_unary_op) <ADDR_EXPR>: Remove left-overs. Issue + errors on bit-fields and reverse SSO here and not... + (c_mark_addressable): ...here. change here, when handling inline asm constraints that don't allow registers the FEs call *mark_addressable: 9265 /* If the operand is going to end up in memory, 9266 mark it addressable. */ 9267 if (!allows_reg && !c_mark_addressable (output)) 9268 output = error_mark_node; and previously that would diagnose the bitfields but now it doesn't. So, one way to fix this is restore the error also in c_mark_addressable (and guess C++ FE too), or at the spots where for inline asm c_mark_addressable is called also check for bit-fields and diagnose there, or fix the ICE during expansion where it is diagnosed right now. E.g. instantiate_virtual_regs_in_insn when seeing errors in inline asm will do: /* For asm goto, instead of fixing up all the edges just clear the template and clear input and output operands and strip away clobbers. */ if (JUMP_P (insn)) { rtx asm_op = extract_asm_operands (PATTERN (insn)); PATTERN (insn) = asm_op; PUT_MODE (asm_op, VOIDmode); ASM_OPERANDS_TEMPLATE (asm_op) = ggc_strdup (""); ASM_OPERANDS_OUTPUT_CONSTRAINT (asm_op) = ""; ASM_OPERANDS_OUTPUT_IDX (asm_op) = 0; ASM_OPERANDS_INPUT_VEC (asm_op) = rtvec_alloc (0); ASM_OPERANDS_INPUT_CONSTRAINT_VEC (asm_op) = rtvec_alloc (0); } else delete_insn (insn); so perhaps expansion when it detects errors should treat it similarly, don't emit anything unless it is asm goto and trivialize asm goto. Note, the cfgexpand.c and FE fixes can be done both.