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/types.cpp | |
| parent | 6157af56e9b6ed3baf192d8b39710f4124b1ea91 (diff) | |
Improve parapoly support for `^T` to `[^]$V` and vice versa
Diffstat (limited to 'src/types.cpp')
| -rw-r--r-- | src/types.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/types.cpp b/src/types.cpp index e917d30fa..5ebc8689f 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -2107,6 +2107,9 @@ bool is_type_polymorphic(Type *t, bool or_specialized=false) { case Type_Pointer: return is_type_polymorphic(t->Pointer.elem, or_specialized); + case Type_MultiPointer: + return is_type_polymorphic(t->MultiPointer.elem, or_specialized); + case Type_SoaPointer: return is_type_polymorphic(t->SoaPointer.elem, or_specialized); @@ -2130,6 +2133,15 @@ bool is_type_polymorphic(Type *t, bool or_specialized=false) { case Type_Slice: return is_type_polymorphic(t->Slice.elem, or_specialized); + case Type_Matrix: + if (t->Matrix.generic_row_count != nullptr) { + return true; + } + if (t->Matrix.generic_column_count != nullptr) { + return true; + } + return is_type_polymorphic(t->Matrix.elem, or_specialized); + case Type_Tuple: for_array(i, t->Tuple.variables) { if (is_type_polymorphic(t->Tuple.variables[i]->type, or_specialized)) { @@ -2196,6 +2208,34 @@ bool is_type_polymorphic(Type *t, bool or_specialized=false) { } break; + case Type_BitSet: + if (is_type_polymorphic(t->BitSet.elem, or_specialized)) { + return true; + } + if (t->BitSet.underlying != nullptr && + is_type_polymorphic(t->BitSet.underlying, or_specialized)) { + return true; + } + break; + + case Type_RelativeSlice: + if (is_type_polymorphic(t->RelativeSlice.slice_type, or_specialized)) { + return true; + } + if (t->RelativeSlice.base_integer != nullptr && + is_type_polymorphic(t->RelativeSlice.base_integer, or_specialized)) { + return true; + } + break; + case Type_RelativePointer: + if (is_type_polymorphic(t->RelativePointer.pointer_type, or_specialized)) { + return true; + } + if (t->RelativePointer.base_integer != nullptr && + is_type_polymorphic(t->RelativePointer.base_integer, or_specialized)) { + return true; + } + break; } return false; |