diff options
| author | gingerBill <bill@gingerbill.org> | 2017-12-03 23:03:40 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2017-12-03 23:03:40 +0000 |
| commit | 596a2c835554a26cb0ad1f83892a3a11c04bad25 (patch) | |
| tree | 432c9cbf862d33c840c8664a4f31587e142cfc35 /src/check_expr.cpp | |
| parent | 9f52b2c2834a3a7248784492a3ede3a8a9063f6a (diff) | |
Procedure grouping `foo :: proc[foo16, foo32];`
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index eaa54306c..36419d172 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -997,6 +997,43 @@ Entity *check_ident(Checker *c, Operand *o, AstNode *n, Type *named_type, Type * gb_free(heap_allocator(), procs); } + if (e->kind == Entity_ProcedureGrouping) { + auto *pge = &e->ProcedureGrouping; + Entity **procs = pge->entities.data; + isize overload_count = pge->entities.count; + bool skip = false; + + if (type_hint != nullptr) { + gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&c->tmp_arena); + defer (gb_temp_arena_memory_end(tmp)); + + // NOTE(bill): These should be done + for (isize i = 0; i < overload_count; i++) { + Type *t = base_type(procs[i]->type); + if (t == t_invalid) { + continue; + } + Operand x = {}; + x.mode = Addressing_Value; + x.type = t; + if (check_is_assignable_to(c, &x, type_hint)) { + e = procs[i]; + add_entity_use(c, n, e); + skip = true; + break; + } + } + } + + if (!skip) { + o->mode = Addressing_Overload; + o->type = t_invalid; + o->overload_count = overload_count; + o->overload_entities = procs; + return nullptr; + } + } + add_entity_use(c, n, e); check_entity_decl(c, e, nullptr, named_type); @@ -4427,11 +4464,12 @@ CallArgumentData check_call_arguments(Checker *c, Operand *operand, Type *proc_t defer (gb_free(heap_allocator(), procs)); defer (gb_free(heap_allocator(), valids)); - String name = procs[0]->token.string; + gbString expr_name = expr_to_string(operand->expr); + defer (gb_string_free(expr_name)); for (isize i = 0; i < overload_count; i++) { Entity *e = procs[i]; - GB_ASSERT(e->token.string == name); + // GB_ASSERT(e->token.string == name); DeclInfo *d = decl_info_of_entity(&c->info, e); GB_ASSERT(d != nullptr); check_entity_decl(c, e, d, nullptr); @@ -4476,7 +4514,7 @@ CallArgumentData check_call_arguments(Checker *c, Operand *operand, Type *proc_t if (valid_count == 0) { - error(operand->expr, "No overloads or ambiguous call for '%.*s' that match with the given arguments", LIT(name)); + error(operand->expr, "No overloads or ambiguous call for '%s' that match with the given arguments", expr_name); gb_printf_err("\tGiven argument types -> ("); for_array(i, operands) { Operand o = operands[i]; @@ -4502,6 +4540,7 @@ CallArgumentData check_call_arguments(Checker *c, Operand *operand, Type *proc_t } else { pt = type_to_string(t); } + String name = proc->token.string; gb_printf_err("\t%.*s :: %s at %.*s(%td:%td) with score %lld\n", LIT(name), pt, LIT(pos.file), pos.line, pos.column, cast(long long)valids[i].score); // gb_printf_err("\t%.*s :: %s at %.*s(%td:%td)\n", LIT(name), pt, LIT(pos.file), pos.line, pos.column); gb_string_free(pt); @@ -4511,7 +4550,7 @@ CallArgumentData check_call_arguments(Checker *c, Operand *operand, Type *proc_t } result_type = t_invalid; } else if (valid_count > 1) { - error(operand->expr, "Ambiguous procedure call '%.*s' tha match with the given arguments", LIT(name)); + error(operand->expr, "Ambiguous procedure call '%s' tha match with the given arguments", expr_name); gb_printf_err("\tGiven argument types -> ("); for_array(i, operands) { Operand o = operands[i]; @@ -4532,6 +4571,7 @@ CallArgumentData check_call_arguments(Checker *c, Operand *operand, Type *proc_t } else { pt = type_to_string(t); } + String name = proc->token.string; // gb_printf_err("\t%.*s :: %s at %.*s(%td:%td) with score %lld\n", LIT(name), pt, LIT(pos.file), pos.line, pos.column, cast(long long)valids[i].score); gb_printf_err("\t%.*s :: %s at %.*s(%td:%td)\n", LIT(name), pt, LIT(pos.file), pos.line, pos.column); gb_string_free(pt); @@ -5149,6 +5189,11 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t o->mode = Addressing_Constant; case_end; + case_ast_node(pg, ProcGrouping, node); + error(node, "Illegal use of a procedure grouping"); + o->mode = Addressing_Invalid; + case_end; + case_ast_node(pl, ProcLit, node); CheckerContext prev_context = c->context; DeclInfo *decl = nullptr; @@ -6143,6 +6188,15 @@ gbString write_expr_to_string(gbString str, AstNode *node) { str = gb_string_appendc(str, "---"); case_end; + case_ast_node(pg, ProcGrouping, node); + str = gb_string_appendc(str, "proc["); + for_array(i, pg->args) { + if (i > 0) str = gb_string_appendc(str, ", "); + str = write_expr_to_string(str, pg->args[i]); + } + str = gb_string_append_rune(str, ']'); + case_end; + case_ast_node(pl, ProcLit, node); str = write_expr_to_string(str, pl->type); case_end; |