basic type unification, fix (gen 2)

This commit is contained in:
ProgramSnail 2024-09-17 00:01:39 +03:00
parent 190046498a
commit 92e1c564e6
2 changed files with 23 additions and 6 deletions

View file

@ -146,8 +146,15 @@ inline bool can_cast_modifier(Modifier from, Modifier to) {
break; break;
} }
error_handling::handle_general_error("Unreachable"); ::utils::Assert(false, "uUnreachable");
exit(1); // unreachable ::utils::unreachable();
}
inline std::optional<Modifier> choose_min_modifier(Modifier /*left*/,
Modifier /*right*/) {
// TODO: FIXME: implement
::utils::Assert(false, "choose_min_modifier is not implemented yet");
return {};
} }
} // namespace utils } // namespace utils

View file

@ -233,12 +233,20 @@ bool TypeStorage::Unify(Type left_id, Type right_id, UnifyModePolicy policy) {
switch (policy) { switch (policy) {
case UnifyModePolicy::kIgnore: case UnifyModePolicy::kIgnore:
break; break;
case UnifyModePolicy::kApplyStrongest: case UnifyModePolicy::kApplyStrongest: {
left.modifier = utils::ChooseMinModifier(left.modifier, right.modifier); const auto min_modifier =
right.modifier = left.modifier; utils::choose_min_modifier(left.modifier, right.modifier);
if (not min_modifier.has_value()) {
return false;
}
left.modifier = min_modifier.value();
right.modifier = min_modifier.value();
break; break;
}
case UnifyModePolicy::kCheckLeftIsSubmode: case UnifyModePolicy::kCheckLeftIsSubmode:
if (not utils::IsSubmodifier(left.modifier, right.modifier)) { if (not utils::can_cast_modifier(left.modifier, right.modifier)) {
return false; return false;
} }
break; break;
@ -314,6 +322,8 @@ bool TypeStorage::Resolve(Type generic, const TypeData &replacement,
type.modifier = modifier; type.modifier = modifier;
} }
} }
return true;
} }
// //