aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-12-14 15:45:14 +0000
committergingerBill <bill@gingerbill.org>2018-12-14 15:45:14 +0000
commit57d4333ed3a36778a034f144a6998587d61ed831 (patch)
treec4e8ca307f5ff4fc3ae45822d748df4744f476a9 /src
parent26f11f12aba9176b567fac2bb809e1b821a4ef93 (diff)
Fix polymorphic procedure generation with debug information
Diffstat (limited to 'src')
-rw-r--r--src/check_expr.cpp13
-rw-r--r--src/ir.cpp2
-rw-r--r--src/ir_print.cpp2
3 files changed, 12 insertions, 5 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index cb7be9b74..6e4bf05e6 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -265,7 +265,6 @@ bool find_or_generate_polymorphic_procedure(CheckerContext *c, Entity *base_enti
}
- bool generate_type_again = nctx.no_polymorphic_errors;
auto *pt = &src->Proc;
@@ -293,8 +292,12 @@ bool find_or_generate_polymorphic_procedure(CheckerContext *c, Entity *base_enti
}
}
-
+#if 0
+ bool generate_type_again = nctx.no_polymorphic_errors;
if (generate_type_again) {
+#else
+ {
+#endif
// LEAK TODO(bill): This is technically a memory leak as it has to generate the type twice
bool prev_no_polymorphic_errors = nctx.no_polymorphic_errors;
defer (nctx.no_polymorphic_errors = prev_no_polymorphic_errors);
@@ -5004,7 +5007,11 @@ CallArgumentError check_polymorphic_record_type(CheckerContext *c, Operand *oper
}
} else {
i64 s = 0;
- if (!check_is_assignable_to_with_score(c, o, e->type, &s)) {
+ if (is_type_generic(o->type)) {
+ // Polymorphic name!
+ score += assign_score_function(0);
+ continue;
+ } else if (!check_is_assignable_to_with_score(c, o, e->type, &s)) {
if (show_error) {
check_assignment(c, o, e->type, str_lit("polymorphic type argument"));
}
diff --git a/src/ir.cpp b/src/ir.cpp
index 4ac59b647..e11d1a054 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -2712,7 +2712,7 @@ void ir_value_set_debug_location(irProcedure *proc, irValue *v) {
gb_printf_err("\t%.*s\n", LIT(instr->DebugDeclare.entity->token.string));
}
}
- GB_PANIC("Value wihout debug location: %.*s %p; %p", LIT(proc->name), proc->entity, v);
+ GB_PANIC("Value without debug location: %.*s %p; %p :: %s", LIT(proc->name), proc->entity, v, type_to_string(proc->type));
}
}
}
diff --git a/src/ir_print.cpp b/src/ir_print.cpp
index 2536679d0..eadd091bd 100644
--- a/src/ir_print.cpp
+++ b/src/ir_print.cpp
@@ -236,7 +236,7 @@ bool ir_print_debug_location(irFileBuffer *f, irModule *m, irValue *v) {
} else {
irProcedure *proc = v->Instr.block->proc;
if (proc->entity != nullptr) {
- GB_ASSERT(proc->is_entry_point || (string_compare(proc->name, str_lit(IR_STARTUP_RUNTIME_PROC_NAME)) == 0));
+ // GB_ASSERT(proc->is_entry_point || (string_compare(proc->name, str_lit(IR_STARTUP_RUNTIME_PROC_NAME)) == 0));
}
}
return false;