aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-11-08 23:54:09 +0000
committergingerBill <bill@gingerbill.org>2020-11-08 23:54:09 +0000
commit44baf56d624240aae3302a38a5083341d8fede3a (patch)
tree9b77c6d4fe55152434263c2b08c14e48cd99a576 /src/types.cpp
parent7c5247f5fb78263604abb301a67b6bb8a7de2f2a (diff)
Fix cyclic check in `is_type_polymorphic`
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/types.cpp b/src/types.cpp
index fc4544385..f4d375f4f 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -323,6 +323,7 @@ String const type_strings[] = {
enum TypeFlag : u32 {
TypeFlag_Polymorphic = 1<<1,
TypeFlag_PolySpecialized = 1<<2,
+ TypeFlag_InProcessOfCheckingPolymorphic = 1<<3,
};
struct Type {
@@ -1695,12 +1696,23 @@ TypeTuple *get_record_polymorphic_params(Type *t) {
bool is_type_polymorphic(Type *t, bool or_specialized=false) {
+ if (t->flags & TypeFlag_InProcessOfCheckingPolymorphic) {
+ return false;
+ }
+
switch (t->kind) {
case Type_Generic:
return true;
case Type_Named:
- return is_type_polymorphic(t->Named.base, or_specialized);
+ {
+ u32 flags = t->flags;
+ t->flags |= TypeFlag_InProcessOfCheckingPolymorphic;
+ bool ok = is_type_polymorphic(t->Named.base, or_specialized);
+ t->flags = flags;
+ return ok;
+ }
+
case Type_Opaque:
return is_type_polymorphic(t->Opaque.elem, or_specialized);
case Type_Pointer: