diff options
| author | gingerBill <bill@gingerbill.org> | 2022-09-20 22:47:53 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-09-20 22:47:53 +0100 |
| commit | eb7a9c55b03efe0245eb4ccd1abd552edc99224d (patch) | |
| tree | 91a228ce6df906b7ce2f05bf193460a06b13b631 /src/check_expr.cpp | |
| parent | 6157af56e9b6ed3baf192d8b39710f4124b1ea91 (diff) | |
Improve parapoly support for `^T` to `[^]$V` and vice versa
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 891a9ebcb..196982084 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1143,6 +1143,12 @@ bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, Type *source, return true; } return is_polymorphic_type_assignable(c, poly->Pointer.elem, source->Pointer.elem, true, modify_type); + } else if (source->kind == Type_MultiPointer) { + isize level = check_is_assignable_to_using_subtype(source->MultiPointer.elem, poly->Pointer.elem); + if (level > 0) { + return true; + } + return is_polymorphic_type_assignable(c, poly->Pointer.elem, source->MultiPointer.elem, true, modify_type); } return false; @@ -1153,6 +1159,12 @@ bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, Type *source, return true; } return is_polymorphic_type_assignable(c, poly->MultiPointer.elem, source->MultiPointer.elem, true, modify_type); + } else if (source->kind == Type_Pointer) { + isize level = check_is_assignable_to_using_subtype(source->Pointer.elem, poly->MultiPointer.elem); + if (level > 0) { + return true; + } + return is_polymorphic_type_assignable(c, poly->MultiPointer.elem, source->Pointer.elem, true, modify_type); } return false; case Type_Array: |