From e0f2a1620e40e4de6aca579fd5e2c26fadeae4fd Mon Sep 17 00:00:00 2001 From: Sofia Date: Mon, 13 Apr 2026 21:36:44 +0300 Subject: [PATCH] Implicitly add cast if implicit cast is found --- src/typechecker.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/typechecker.cpp b/src/typechecker.cpp index 1c697d2..90849d0 100644 --- a/src/typechecker.cpp +++ b/src/typechecker.cpp @@ -5,19 +5,24 @@ #include "result.h" namespace { - enum class TypecheckRes { + enum class TypecheckResKind { Ok, Castable, }; + struct TypecheckRes { + TypecheckResKind kind; + std::shared_ptr result; + }; + Result check_type(typecheck::State& state, std::shared_ptr checked, std::shared_ptr target) { auto potential_cast = types::find_cast(state.casts, checked, target); if (types::types_equal(checked, target)) { - return TypecheckRes::Ok; + return TypecheckRes{ TypecheckResKind::Ok, target }; } else if (potential_cast.has_value() && potential_cast->allow_implicit) { - return TypecheckRes::Castable; + return TypecheckRes{ TypecheckResKind::Castable, target }; } return std::string{ "Types " + checked->formatted() + " and " + target->formatted() + " incompatible" }; @@ -29,12 +34,13 @@ namespace { typecheck::State& state) { if (res.ok()) { auto result = res.unwrap(); - if (result == TypecheckRes::Ok) { + if (result.kind == TypecheckResKind::Ok) { return expr; } else { - state.errors.push_back(CompileError("Casting not yet implemented", expr->m_meta)); - return expr; + return std::unique_ptr { + new AST::CastExpression{ expr->m_meta, result.result, std::move(expr) } + }; } } else {