Implement types_equal for Structs

This commit is contained in:
Sofia 2026-04-15 19:34:09 +03:00
parent b664ca8f9d
commit 4b4d3ce14b
2 changed files with 28 additions and 1 deletions

View File

@ -348,7 +348,8 @@ namespace AST {
this->m_expressions[i] = handle_res(std::move(this->m_expressions[i]), res, state); 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 { else {
if (this->m_expressions.size() > 0) { if (this->m_expressions.size() > 0) {
@ -357,6 +358,10 @@ namespace AST {
this->m_meta)); this->m_meta));
return *expected_ty; return *expected_ty;
} }
else {
this->m_ty = *expected_ty;
return this->m_ty;
}
} }
} }

View File

@ -258,6 +258,28 @@ namespace types {
return types_equal(ty1->m_inner, ty2->m_inner) && ty1->m_size == ty2->m_size; 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<StructType*>(type1.get());
auto ty2 = dynamic_cast<StructType*>(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<int>(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 { else {
return false; return false;
} }