diff --git a/lang/nodes/include/basic_nodes.hpp b/lang/nodes/include/basic_nodes.hpp index d816249..ecc0a07 100644 --- a/lang/nodes/include/basic_nodes.hpp +++ b/lang/nodes/include/basic_nodes.hpp @@ -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 choose_min_modifier(Modifier /*left*/, + Modifier /*right*/) { + // TODO: FIXME: implement + ::utils::Assert(false, "choose_min_modifier is not implemented yet"); + return {}; } } // namespace utils diff --git a/lang/nodes/src/type_nodes.cpp b/lang/nodes/src/type_nodes.cpp index b0ff2af..425a4f8 100644 --- a/lang/nodes/src/type_nodes.cpp +++ b/lang/nodes/src/type_nodes.cpp @@ -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; } //