mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-05 22:48:43 +00:00
basic type unification, fix (gen 2)
This commit is contained in:
parent
190046498a
commit
92e1c564e6
2 changed files with 23 additions and 6 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue