diff --git a/src/codegen.cpp b/src/codegen.cpp index b2f536a..7effa5a 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -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{ 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) { diff --git a/src/parsing.cpp b/src/parsing.cpp index 4a6f59b..865e744 100644 --- a/src/parsing.cpp +++ b/src/parsing.cpp @@ -80,10 +80,39 @@ namespace parsing { } } + Result, 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::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{ + 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();