Fix bug with loading values, parse casts

This commit is contained in:
Sofia 2026-04-13 21:21:46 +03:00
parent fa01b22b81
commit 1814ce2cc9
2 changed files with 32 additions and 1 deletions

View File

@ -142,7 +142,9 @@ namespace AST {
builder.builder->CreateStore(value.value, ptr, false);
}
scope.values[this->m_name] = codegen::StackValue{ ptr, this->m_type };
auto ptr_ty = std::shared_ptr<types::Type>{ new types::PointerType{ this->m_type } };
scope.values[this->m_name] = codegen::StackValue{ ptr, ptr_ty };
}
void IfStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) {

View File

@ -80,10 +80,39 @@ namespace parsing {
}
}
Result<std::shared_ptr<types::Type>, std::string> parse_cast(token::TokenStream& stream) {
token::TokenStream inner{ stream };
try {
inner.expect(token::Type::Symbol, "(");
auto ty = parse_type(inner).unwrap();
inner.expect(token::Type::Symbol, ")");
stream.m_position = inner.m_position;
return ty;
}
catch (std::runtime_error& error) {
return std::string{ error.what() };
}
}
Result<std::unique_ptr<AST::Expression>, std::string> parse_primary_expression(token::TokenStream& stream) {
token::TokenStream inner{ stream };
try {
auto before_meta = inner.metadata();
if (auto cast = parse_cast(inner); cast.ok()) {
auto expr = parse_expression(inner).unwrap();
stream.m_position = inner.m_position;
return std::unique_ptr<AST::Expression>{
new AST::CastExpression{
before_meta + inner.metadata(),
cast.unwrap(),
std::move(expr)
}
};
}
auto plain_expr = parse_plain_expression(inner);
while (inner.peek().content == "(") {
inner.next();