From d3f0a730fda047a5ca05308978ac52c6453debfd Mon Sep 17 00:00:00 2001 From: Sofia Date: Tue, 14 Apr 2026 17:01:08 +0300 Subject: [PATCH] Make strings be char[n] --- src/casting.cpp | 18 ++++++++++++++++++ src/codegen.cpp | 6 ++++-- src/typechecker.cpp | 2 +- test.c | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/casting.cpp b/src/casting.cpp index 09596d1..8aa1864 100644 --- a/src/casting.cpp +++ b/src/casting.cpp @@ -53,6 +53,24 @@ namespace types { std::shared_ptr casted_ty, std::shared_ptr target_ty) { + if (casted_ty->m_kind == types::TypeKind::Array && target_ty->m_kind == types::TypeKind::Pointer) { + auto array_ty = dynamic_cast(casted_ty.get()); + auto ptr_ty = dynamic_cast(target_ty.get()); + if (!types_equal(array_ty->m_inner, ptr_ty->m_inner)) + return {}; + return CastDefinition{ casted_ty, target_ty, true, + [](codegen::Builder& builder, std::shared_ptr target, llvm::Value* value) { + auto ptr_ty = dynamic_cast(target.get()); + + std::vector indices {}; + indices.push_back(llvm::ConstantInt::get( + builder.builder->getInt32Ty(), + 0 + )); + return builder.builder->CreateGEP(ptr_ty->m_inner->codegen(builder), value, indices, "cast_gep"); + } }; + } + for (auto& cast : casts) { if (types_equal(cast.casted_ty, casted_ty) && types_equal(cast.target_ty, target_ty)) { return cast; diff --git a/src/codegen.cpp b/src/codegen.cpp index cf4424c..e294bdb 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -26,8 +26,10 @@ namespace AST { } codegen::StackValue StringLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope&) { - - auto stack_type = new types::PointerType{ std::make_unique(types::FundamentalTypeKind::Char) }; + auto stack_type = new types::ArrayType{ + std::make_unique(types::FundamentalTypeKind::Char), + static_cast(this->m_value.size()) + 1 + }; auto str = llvm::StringRef{ this->m_value.c_str() }; diff --git a/src/typechecker.cpp b/src/typechecker.cpp index c2b74fd..9ae9f6d 100644 --- a/src/typechecker.cpp +++ b/src/typechecker.cpp @@ -89,7 +89,7 @@ namespace AST { auto char_ty = std::shared_ptr{ new types::FundamentalType{ types::FundamentalTypeKind::Char } }; - auto ptr_ty = new types::PointerType{ char_ty }; + auto ptr_ty = new types::ArrayType{ char_ty, static_cast(this->m_value.size()) + 1 }; return std::shared_ptr{ptr_ty}; } diff --git a/test.c b/test.c index 8e656e6..137e975 100644 --- a/test.c +++ b/test.c @@ -17,6 +17,7 @@ int main() { somelist[0] = 15; somelist[1] = 20; + somelist[2] = 25; return somelist[0]; } \ No newline at end of file