From 4b4d3ce14b925a9b7efbdd8b9eea8c10a1b14315 Mon Sep 17 00:00:00 2001 From: Sofia Date: Wed, 15 Apr 2026 19:34:09 +0300 Subject: [PATCH] Implement types_equal for Structs --- src/typechecker.cpp | 7 ++++++- src/types.cpp | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/typechecker.cpp b/src/typechecker.cpp index 6f9dba4..91630f6 100644 --- a/src/typechecker.cpp +++ b/src/typechecker.cpp @@ -348,7 +348,8 @@ namespace AST { this->m_expressions[i] = handle_res(std::move(this->m_expressions[i]), res, state); } - return *expected_ty; + this->m_ty = *expected_ty; + return this->m_ty; } else { if (this->m_expressions.size() > 0) { @@ -357,6 +358,10 @@ namespace AST { this->m_meta)); return *expected_ty; } + else { + this->m_ty = *expected_ty; + return this->m_ty; + } } } diff --git a/src/types.cpp b/src/types.cpp index 91e94ff..e643b6e 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -258,6 +258,28 @@ namespace types { return types_equal(ty1->m_inner, ty2->m_inner) && ty1->m_size == ty2->m_size; } + else if (type1->m_kind == TypeKind::Struct) { + auto ty1 = dynamic_cast(type1.get()); + auto ty2 = dynamic_cast(type2.get()); + + if (ty1->m_fields.has_value() != ty2->m_fields.has_value()) + return false; + + if (ty1->m_fields) { + if (ty1->m_fields->size() != ty2->m_fields->size()) + return false; + + for (int i = 0; i < static_cast(ty1->m_fields->size()); i++) { + auto field1 = (*ty1->m_fields)[i]; + auto field2 = (*ty2->m_fields)[i]; + if (!types_equal(field1.second, field2.second)) + return false; + } + } + + return true; + + } else { return false; }