From b664ca8f9dde5ed2e566bb1f2ee24fe2f483ef00 Mon Sep 17 00:00:00 2001 From: Sofia Date: Wed, 15 Apr 2026 19:28:09 +0300 Subject: [PATCH] Typecheck list initializer for structs --- src/typechecker.cpp | 30 ++++++++++++++++++++++++++++++ test.c | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/typechecker.cpp b/src/typechecker.cpp index 37ff29b..6f9dba4 100644 --- a/src/typechecker.cpp +++ b/src/typechecker.cpp @@ -330,6 +330,36 @@ namespace AST { } }; } + else if ((*expected_ty)->m_kind == types::TypeKind::Struct) { + auto struct_ty = dynamic_cast(expected_ty->get()); + + if (struct_ty->m_fields) { + if (this->m_expressions.size() > struct_ty->m_fields->size()) { + state.errors.push_back(CompileError( + "Too many initializer values for " + struct_ty->formatted(), + this->m_meta)); + return *expected_ty; + } + + for (int i = 0; i < static_cast(this->m_expressions.size()); i++) { + auto expected_field = (*struct_ty->m_fields)[i]; + auto expr_ty = this->m_expressions[i]->typecheck(state, scope, expected_field.second); + auto res = check_type(state, expr_ty, expected_field.second); + this->m_expressions[i] = handle_res(std::move(this->m_expressions[i]), res, state); + } + + return *expected_ty; + } + else { + if (this->m_expressions.size() > 0) { + state.errors.push_back(CompileError( + "Too many initializer values for " + struct_ty->formatted(), + this->m_meta)); + return *expected_ty; + } + } + + } else { return std::shared_ptr { new types::FundamentalType{ types::FundamentalTypeKind::Void } diff --git a/test.c b/test.c index 8de33a0..2efd44c 100644 --- a/test.c +++ b/test.c @@ -24,7 +24,7 @@ int main() { printf(" first element: %d!", somelist[0]); - struct Otus otus; + struct Otus otus = { 5 }; return 0; } \ No newline at end of file