From cd3fa8b6e4225f5c3cf51ddd3d545a76b5528d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Sat, 5 Jul 2025 09:36:12 +0900 Subject: [PATCH] Handle null types --- src/Compiler/ModuleBuilder.cpp | 3 +++ src/Logger.cpp | 5 +++++ src/Parser/Expression/ExpressionBinary.cpp | 14 ++++++++------ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index eaebd4b..ecc9281 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -228,6 +228,9 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr expression } llvm::Value *ModuleBuilder::valueForLiteral(shared_ptr expression) { + if (expression->getValueType() == nullptr) + return llvm::UndefValue::get(typeVoid); + switch (expression->getValueType()->getKind()) { case ValueTypeKind::NONE: return llvm::UndefValue::get(typeVoid); diff --git a/src/Logger.cpp b/src/Logger.cpp index f2d7727..f4617f1 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -367,6 +367,9 @@ string Logger::toString(shared_ptr expression) { } string Logger::toString(shared_ptr expression) { + if (expression->getValueType() == nullptr) + return "?"; + switch (expression->getValueType()->getKind()) { case ValueTypeKind::NONE: return "NONE"; @@ -392,6 +395,8 @@ string Logger::toString(shared_ptr expression) { string Logger::toString(shared_ptr expression) { string text; text += toString(expression->getStatementBlock()); + if (!text.empty()) + text += '\n'; if (expression->getResultStatementExpression() != nullptr) text += toString(expression->getResultStatementExpression()); return text; diff --git a/src/Parser/Expression/ExpressionBinary.cpp b/src/Parser/Expression/ExpressionBinary.cpp index aa162fe..4530801 100644 --- a/src/Parser/Expression/ExpressionBinary.cpp +++ b/src/Parser/Expression/ExpressionBinary.cpp @@ -54,13 +54,15 @@ Expression(ExpressionKind::BINARY, nullptr), operation(ExpressionBinaryOperation break; } - // Types must match - if (left->getValueType() != right->getValueType()) - valueType = ValueType::NONE; + if (left->getValueType() != nullptr && right->getValueType() != nullptr) { + // Types must match + if (left->getValueType() != right->getValueType()) + valueType = ValueType::NONE; - // Booleans can only do = or != - if (valueType->getKind() == ValueTypeKind::BOOL && (token->getKind() != TokenKind::EQUAL || token->getKind() != TokenKind::NOT_EQUAL)) - valueType = ValueType::NONE; + // Booleans can only do = or != + if (valueType->getKind() == ValueTypeKind::BOOL && (token->getKind() != TokenKind::EQUAL || token->getKind() != TokenKind::NOT_EQUAL)) + valueType = ValueType::NONE; + } } ExpressionBinaryOperation ExpressionBinary::getOperation() {