diff --git a/src/check_expr.cpp b/src/check_expr.cpp index d714e90a8..2d77fe40a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -5286,8 +5286,8 @@ CallArgumentError check_polymorphic_record_type(CheckerContext *c, Operand *oper TypeTuple *tuple = get_record_polymorphic_params(original_type); isize param_count = tuple->variables.count; isize minimum_param_count = param_count; - for (minimum_param_count = tuple->variables.count-1; minimum_param_count >= 0; minimum_param_count--) { - Entity *e = tuple->variables[minimum_param_count]; + for (; minimum_param_count > 0; minimum_param_count--) { + Entity *e = tuple->variables[minimum_param_count-1]; if (e->kind != Entity_Constant) { break; } @@ -5296,6 +5296,7 @@ CallArgumentError check_polymorphic_record_type(CheckerContext *c, Operand *oper } } + Array ordered_operands = operands; if (!named_fields) { ordered_operands = array_make(permanent_allocator(), param_count); @@ -5367,6 +5368,13 @@ CallArgumentError check_polymorphic_record_type(CheckerContext *c, Operand *oper return err; } + while (ordered_operands.count >= 0) { + if (ordered_operands[ordered_operands.count-1].expr != nullptr) { + break; + } + array_pop(&ordered_operands); + } + if (minimum_param_count != param_count) { if (param_count < ordered_operands.count) { error(call, "Too many polymorphic type arguments, expected a maximum of %td, got %td", param_count, ordered_operands.count); diff --git a/src/check_type.cpp b/src/check_type.cpp index 419904876..0252bc989 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -250,9 +250,14 @@ Entity *find_polymorphic_record_entity(CheckerContext *ctx, Type *original_type, bool skip = false; + GB_ASSERT(ordered_operands.count >= param_count); + for (isize j = 0; j < param_count; j++) { Entity *p = tuple->variables[j]; Operand o = ordered_operands[j]; + if (o.expr == nullptr) { + return nullptr; + } Entity *oe = entity_of_node(o.expr); if (p == oe) { // NOTE(bill): This is the same type, make sure that it will be be same thing and use that diff --git a/src/checker.cpp b/src/checker.cpp index 8f426f116..2986ccb1a 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -937,7 +937,7 @@ Type *type_of_expr(Ast *expr) { } Entity *implicit_entity_of_node(Ast *clause) { - if (clause->kind == Ast_CaseClause) { + if (clause != nullptr && clause->kind == Ast_CaseClause) { return clause->CaseClause.implicit_entity; } return nullptr;