aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2019-11-05 19:37:19 +0000
committergingerBill <bill@gingerbill.org>2019-11-05 19:37:19 +0000
commita634444f99dca486673b8575a136dd99886ffb8a (patch)
tree7f52260c3d5c71460d70864a3a411e2944005b7f /src
parent40546fbde27601c147f5c64d9c1138a5a40bb3b8 (diff)
Fix "Polymorphic parameter declared in return type doesn't compile #464" by giving a conversion error (code wasn't handling polymorphic result types as intended)
Diffstat (limited to 'src')
-rw-r--r--src/check_expr.cpp8
-rw-r--r--src/check_type.cpp10
2 files changed, 16 insertions, 2 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 1d59f0530..995582f64 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -5731,9 +5731,13 @@ Entity **populate_proc_parameter_list(CheckerContext *c, Type *proc_type, isize
}
} else {
// NOTE(bill): Create 'lhs' list in order to ignore parameters which are polymorphic
- lhs_count = pt->params->Tuple.variables.count;
+ if (pt->params == nullptr) {
+ lhs_count = 0;
+ } else {
+ lhs_count = pt->params->Tuple.variables.count;
+ }
lhs = gb_alloc_array(heap_allocator(), Entity *, lhs_count);
- for_array(i, pt->params->Tuple.variables) {
+ for (isize i = 0; i < lhs_count; i++) {
Entity *e = pt->params->Tuple.variables[i];
if (!is_type_polymorphic(e->type)) {
lhs[i] = e;
diff --git a/src/check_type.cpp b/src/check_type.cpp
index 9f8310e44..c733cfb4c 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -2507,6 +2507,16 @@ bool check_procedure_type(CheckerContext *ctx, Type *type, Ast *proc_type_node,
break;
}
}
+ for (isize i = 0; i < result_count; i++) {
+ Entity *e = results->Tuple.variables[i];
+ if (e->kind != Entity_Variable) {
+ is_polymorphic = true;
+ break;
+ } else if (is_type_polymorphic(e->type)) {
+ is_polymorphic = true;
+ break;
+ }
+ }
type->Proc.is_polymorphic = is_polymorphic;
return success;