Branch: Tag:

2022-05-10

2022-05-10 08:26:46 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Compiler [Typechecker]: Fix some special cases with T_VOID in type_binop().

Also adds some previously missing handling of markers.

5822:    add_ref(a);    return a;    } +  if (aflags & PT_FLAG_CMP_NULLABLE) {    /* Return zero. */    add_ref(b);    return b; -  +  }    } else if (op & PT_BINOP_MINUS) {    if (!(bflags & PT_FLAG_CMP_VOIDABLE)) {    /* Return void. */
5845:    add_ref(b);    return b;    } +  if (bflags & PT_FLAG_CMP_NULLABLE) {    /* Return zero. */    add_ref(a);    return a; -  +  }    } else if (op & PT_BINOP_MINUS) { -  if (!(aflags & PT_FLAG_CMP_VOIDABLE)) { +  if (!(bflags & PT_FLAG_CMP_NULLABLE)) {    /* Return zero. */    add_ref(a);    return a;
5927:    b = a;    goto recur;    } -  if (aflags & (PT_FLAG_CMP_NULLABLE | PT_FLAG_CMP_VOID_IS_ZERO)) { +  if (aflags & PT_FLAG_CMP_VOID_IS_ZERO) {    a = zero_type_string;    goto recur;    } -  +  if ((aflags & PT_FLAG_CMP_NULLABLE) && (op == PT_BINOP_AND)) { +  a = zero_type_string; +  goto recur;    } -  +  }    if (b->type == T_VOID) {    if (op & PT_BINOP_AND) {    if (aflags & PT_FLAG_CMP_VOIDABLE) {
5961:    push_type(T_NOT);    return pop_unfinished_type();    default: -  add_ref(b); -  return b; +  return remap_markers(b, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    }    }    }
5984:    push_type(T_NOT);    return pop_unfinished_type();    default: -  add_ref(a); -  return a; +  return remap_markers(a, remap, remap_flags);    }    }    }