diff options
| author | gingerBill <bill@gingerbill.org> | 2020-11-08 23:54:09 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-11-08 23:54:09 +0000 |
| commit | 44baf56d624240aae3302a38a5083341d8fede3a (patch) | |
| tree | 9b77c6d4fe55152434263c2b08c14e48cd99a576 /src/types.cpp | |
| parent | 7c5247f5fb78263604abb301a67b6bb8a7de2f2a (diff) | |
Fix cyclic check in `is_type_polymorphic`
Diffstat (limited to 'src/types.cpp')
| -rw-r--r-- | src/types.cpp | 14 |
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: |