Branch: Tag:

2021-11-23

2021-11-23 14:37:24 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Compiler [Typechecker]: Filter type markers with their match pattern.

Fixes type markers containing non-matching types.

7435:    ret = low_match_types(a->cdr, b, flags);    if(ret && (!a_markers[m] || b->type != T_VOID))    { +  struct pike_type *filtered_b = NULL; +    #ifdef PIKE_DEBUG    if ((m < 0) || (m > 9)) {    Pike_fatal("marker out of range: $%d\n", m);
7445:    push_finished_type_with_markers(b, b_markers, 0);    tmp = pop_unfinished_type();    +  filtered_b = type_binop(PT_BINOP_AND, +  tmp, a->cdr, +  PT_FLAG_CMP_NULLABLE, +  PT_FLAG_CMP_NULLABLE, +  PT_FLAG_REMAP_INHIBIT); +  free_type(tmp); +  tmp = filtered_b; +     type_stack_mark();    low_or_pike_types(a_markers[m], tmp, 0);    if(a_markers[m]) free_type(a_markers[m]);
7575:    ret = low_match_types(a, b->cdr, flags);    if(ret && (!b_markers[m] || a->type != T_VOID))    { +  struct pike_type *filtered_a = NULL; +     type_stack_mark();    push_finished_type_with_markers(a, a_markers, 0);    tmp=pop_unfinished_type();    -  +  filtered_a = type_binop(PT_BINOP_AND, +  tmp, b->cdr, +  PT_FLAG_CMP_NULLABLE, +  PT_FLAG_CMP_NULLABLE, +  PT_FLAG_REMAP_INHIBIT); +  free_type(tmp); +  tmp = filtered_a; +     type_stack_mark();    low_or_pike_types(b_markers[m], tmp, 0);    if(b_markers[m]) free_type(b_markers[m]);