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;
|
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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue