From 8ec4e538f5fe0ebf9cb9bb0df3f42f8b4053e71a Mon Sep 17 00:00:00 2001 From: Sofia Date: Mon, 13 Apr 2026 16:56:33 +0300 Subject: [PATCH] Fix a bug, add type kind --- src/typechecker.cpp | 13 ++++++++++++- src/types.h | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/typechecker.cpp b/src/typechecker.cpp index 84ad77a..bd98d26 100644 --- a/src/typechecker.cpp +++ b/src/typechecker.cpp @@ -62,7 +62,12 @@ namespace AST { ) { auto expr_ty = this->m_fn_expr->typecheck(state, scope, {}); - // TODO make sure function_ty really is a function type + if (expr_ty->m_kind != types::TypeKind::Function) { + state.errors.push_back(CompileError("Tried calling a non-function", this->m_meta)); + return std::shared_ptr { + new types::FundamentalType{ types::FundamentalTypeKind::Void } + }; + } auto fn_ty = dynamic_cast(expr_ty.get()); @@ -123,6 +128,12 @@ namespace AST { typecheck::Scope inner{ scope }; inner.return_ty = return_ty; + for (auto& param : this->m_params) { + if (param.first) { + inner.symbols[*param.first] = param.second; + } + } + if (this->m_statements) { for (auto& statement : *this->m_statements) { statement->typecheck(state, inner); diff --git a/src/types.h b/src/types.h index 8d2adeb..61fdafd 100644 --- a/src/types.h +++ b/src/types.h @@ -18,6 +18,12 @@ namespace types { int operator_precedence(BinOp& op); std::string format_operator(BinOp& op); + enum class TypeKind { + Fundamental, + Function, + Pointer, + }; + enum FundamentalTypeKind { Int, Bool, @@ -27,6 +33,8 @@ namespace types { class Type { public: + TypeKind m_kind; + Type(TypeKind kind) : m_kind{ kind } {} virtual ~Type() = default; virtual std::string formatted() = 0; virtual llvm::Type* codegen(codegen::Builder& builder) = 0; @@ -42,7 +50,7 @@ namespace types { private: FundamentalTypeKind m_ty; public: - FundamentalType(FundamentalTypeKind kind) : m_ty{ kind } {} + FundamentalType(FundamentalTypeKind kind) : Type(TypeKind::Fundamental), m_ty{ kind } {} virtual ~FundamentalType() override = default; virtual std::string formatted() override; virtual llvm::Type* codegen(codegen::Builder& builder) override; @@ -60,7 +68,10 @@ namespace types { std::vector> m_param_tys; bool m_vararg; FunctionType(std::shared_ptr ret_ty, std::vector> param_tys, bool vararg) - : m_ret_ty{ std::move(ret_ty) }, m_param_tys{ std::move(param_tys) }, m_vararg{ vararg } { + : Type(TypeKind::Function) + , m_ret_ty{ std::move(ret_ty) } + , m_param_tys{ std::move(param_tys) } + , m_vararg{ vararg } { } virtual ~FunctionType() override = default; virtual std::string formatted() override; @@ -76,7 +87,7 @@ namespace types { std::shared_ptr m_inner; public: PointerType(std::shared_ptr inner) - : m_inner{ std::move(inner) } { + : Type(TypeKind::Pointer), m_inner{ std::move(inner) } { } virtual ~PointerType() override = default; virtual std::string formatted() override;