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.

Reply via email to