static void
 output_operand_error_record (const operand_error_record *record, char *str)
 {
-  int idx = record->detail.index;
+  const aarch64_operand_error *detail = &record->detail;
+  int idx = detail->index;
   const aarch64_opcode *opcode = record->opcode;
-  enum aarch64_opnd opd_code = (idx != -1 ? opcode->operands[idx]
+  enum aarch64_opnd opd_code = (idx >= 0 ? opcode->operands[idx]
                                : AARCH64_OPND_NIL);
-  const aarch64_operand_error *detail = &record->detail;
 
   switch (detail->kind)
     {
     case AARCH64_OPDE_RECOVERABLE:
     case AARCH64_OPDE_FATAL_SYNTAX_ERROR:
     case AARCH64_OPDE_OTHER_ERROR:
-      gas_assert (idx >= 0);
       /* Use the prepared error message if there is, otherwise use the
         operand description string to describe the error.  */
       if (detail->error != NULL)
        {
-         if (detail->index == -1)
+         if (idx < 0)
            as_bad (_("%s -- `%s'"), detail->error, str);
          else
            as_bad (_("%s at operand %d -- `%s'"),
-                   detail->error, detail->index + 1, str);
+                   detail->error, idx + 1, str);
        }
       else
-       as_bad (_("operand %d should be %s -- `%s'"), idx + 1,
+       {
+         gas_assert (idx >= 0);
+         as_bad (_("operand %d should be %s -- `%s'"), idx + 1,
                aarch64_get_operand_desc (opd_code), str);
+       }
       break;
 
     case AARCH64_OPDE_INVALID_VARIANT:
       if (detail->data[0] != detail->data[1])
        as_bad (_("%s out of range %d to %d at operand %d -- `%s'"),
                detail->error ? detail->error : _("immediate value"),
-               detail->data[0], detail->data[1], detail->index + 1, str);
+               detail->data[0], detail->data[1], idx + 1, str);
       else
        as_bad (_("%s expected to be %d at operand %d -- `%s'"),
                detail->error ? detail->error : _("immediate value"),
-               detail->data[0], detail->index + 1, str);
+               detail->data[0], idx + 1, str);
       break;
 
     case AARCH64_OPDE_REG_LIST:
       if (detail->data[0] == 1)
        as_bad (_("invalid number of registers in the list; "
                  "only 1 register is expected at operand %d -- `%s'"),
-               detail->index + 1, str);
+               idx + 1, str);
       else
        as_bad (_("invalid number of registers in the list; "
                  "%d registers are expected at operand %d -- `%s'"),
-             detail->data[0], detail->index + 1, str);
+             detail->data[0], idx + 1, str);
       break;
 
     case AARCH64_OPDE_UNALIGNED:
       as_bad (_("immediate value should be a multiple of "
                "%d at operand %d -- `%s'"),
-             detail->data[0], detail->index + 1, str);
+             detail->data[0], idx + 1, str);
       break;
 
     default: