aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorftphikari <ftphikari@gmail.com>2022-09-27 11:06:05 +0300
committerGitHub <noreply@github.com>2022-09-27 11:06:05 +0300
commiteb6c388f139607716acf02b0f6e1cd25a5128aad (patch)
tree6b19bfb6aeceabb1d0b6adb81be84b658a8505ba /src/types.cpp
parent42144d957b45e29be1da74a98cfaaf465bfc9861 (diff)
parent0fe006157e6e6f07722bcf4eb7c51a8db07d008c (diff)
Merge branch 'odin-lang:master' into master
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/types.cpp b/src/types.cpp
index e917d30fa..fec324bf4 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -227,7 +227,6 @@ struct TypeProc {
Type *key; \
Type *value; \
Type *entry_type; \
- Type *generated_struct_type; \
Type *internal_type; \
Type *lookup_result_type; \
}) \
@@ -688,6 +687,7 @@ gb_global Type *t_source_code_location_ptr = nullptr;
gb_global Type *t_map_hash = nullptr;
gb_global Type *t_map_header = nullptr;
+gb_global Type *t_map_header_table = nullptr;
gb_global Type *t_equal_proc = nullptr;
@@ -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;