aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-08-21 23:16:30 +0100
committergingerBill <bill@gingerbill.org>2021-08-21 23:16:30 +0100
commit91247a8fe15dd424e15cb9dac57fd2a743393fbd (patch)
treeb7377bf1963ba60a835ca10b8d23ba106b32001c /src/check_expr.cpp
parent18a0fa02c5a05e0b1aa23ff6b84119698161ed2d (diff)
Fix multi pointers for parapoly
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 68009882f..ea553f6bb 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -601,13 +601,13 @@ i64 check_distance_between_types(CheckerContext *c, Operand *operand, Type *type
return 5;
}
// ^T <- [^]T
- if (is_type_pointer(dst) && is_type_multi_pointer(src)) {
+ if (dst->kind == Type_Pointer && src->kind == Type_MultiPointer) {
if (are_types_identical(dst->Pointer.elem, src->MultiPointer.elem)) {
return 4;
}
}
// [^]T <- ^T
- if (is_type_multi_pointer(dst) && is_type_pointer(src)) {
+ if (dst->kind == Type_MultiPointer && src->kind == Type_Pointer) {
if (are_types_identical(dst->MultiPointer.elem, src->Pointer.elem)) {
return 4;
}
@@ -945,6 +945,16 @@ bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, Type *source,
return is_polymorphic_type_assignable(c, poly->Pointer.elem, source->Pointer.elem, true, modify_type);
}
return false;
+
+ case Type_MultiPointer:
+ if (source->kind == Type_MultiPointer) {
+ isize level = check_is_assignable_to_using_subtype(source->MultiPointer.elem, poly->MultiPointer.elem);
+ if (level > 0) {
+ return true;
+ }
+ return is_polymorphic_type_assignable(c, poly->MultiPointer.elem, source->MultiPointer.elem, true, modify_type);
+ }
+ return false;
case Type_Array:
if (source->kind == Type_Array) {
if (poly->Array.generic_count != nullptr) {