aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-09-20 22:47:53 +0100
committergingerBill <bill@gingerbill.org>2022-09-20 22:47:53 +0100
commiteb7a9c55b03efe0245eb4ccd1abd552edc99224d (patch)
tree91a228ce6df906b7ce2f05bf193460a06b13b631 /src/types.cpp
parent6157af56e9b6ed3baf192d8b39710f4124b1ea91 (diff)
Improve parapoly support for `^T` to `[^]$V` and vice versa
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp40
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;