Branch: Tag:

2021-01-27

2021-01-27 18:33:05 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Compiler [Typechecker]: Support NULL as argument type in T_MANY.

1176:       top = *(Pike_compiler->type_stackp);    /* Special case... */ -  if (top->type == T_MIXED) return; /* Probably due to an earlier error */ +  if (!top || top->type == T_MIXED) return; /* Probably due to an earlier error */       Pike_compiler->type_stackp--;   #ifdef PIKE_DEBUG
2734:    t->cdr->type == T_OR &&    ((t->cdr->car->type == T_MIXED && t->cdr->cdr->type == T_VOID) ||    (t->cdr->cdr->type == T_MIXED && t->cdr->car->type == T_VOID)) && -  (t->car->type == T_ZERO || +  (!t->car || +  t->car->type == T_ZERO ||    (t->car->type == T_OR &&    ((t->car->car->type == T_ZERO && t->car->cdr->type == T_VOID) ||    (t->car->cdr->type == T_ZERO && t->car->car->type == T_VOID)))))
2757:    if (t->type != T_MANY) {    string_builder_sprintf(s, ", @%T)", t);    } else { -  if(t->car->type != T_VOID) +  if(!t->car || (t->car->type != T_VOID))    {    if(arg++) string_builder_strcat(s, ", "); -  low_describe_type(s, t->car); +  if (t->car) low_describe_type(s, t->car);    string_builder_strcat(s, " ...");    }    t = t->cdr;
3859:    struct remap_state *remap,    enum pt_remap_flags flags)   { -  if (!remap && !markers && !(flags & PT_FLAG_REMAP_EVAL_MARKERS)) { +  if (!t || (!remap && !markers && !(flags & PT_FLAG_REMAP_EVAL_MARKERS))) {    push_finished_type(t);    return;    }
9738:    /* FALLTHRU */    case T_MANY:    q = q->car; -  if(q->type != T_VOID) return ~num; +  if(!q || (q->type != T_VOID)) return ~num;    return num;    }   }
9891:    add_ref(fun->cdr);    return fun->cdr;    } -  add_ref(fun->car); +  safe_add_ref(fun->car);    return fun->car;       case T_MIXED:
11066:    tmp = NULL;    if (((arg_type->type != T_NOT) ||    (arg_type->car->type != T_MIXED)) && +  fun_type->car &&    (fun_type->car->type == T_NOT) &&    (fun_type->car->car->type == T_OR) &&    ((fun_type->car->car->car->type == T_MIXED) ||
11098:    /* No need to perform advanced checking in the trivial case... */    if (arg_type != (tmp2 = fun_type->car)) {    struct pike_type *t = NULL; -  if (!((flags & CALL_INVERTED_TYPES)? +  if (!tmp2) { +  if (flags & CALL_STRICT) goto no_match; +  } else if (!((flags & CALL_INVERTED_TYPES)?    low_pike_types_le(tmp2, arg_type, 0,    LE_A_B_SWAPPED|LE_EXPLICIT_ZERO):    low_pike_types_le(arg_type, tmp2, 0, 0)) &&    ((flags & CALL_STRICT) ||    !(t = low_match_types(arg_type, tmp2, NO_SHORTCUTS)))) { -  +  no_match:    /* No match. */   #ifdef PIKE_DEBUG    if (l_flag>2) {