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;
}
error_handling::handle_general_error("Unreachable");
exit(1); // unreachable
::utils::Assert(false, "uUnreachable");
::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

View file

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