Fixed returned type from if-else

This commit is contained in:
Rafał Grodziński
2025-06-27 16:37:42 +09:00
parent abb3239ed1
commit b8e66de3e3

View File

@@ -339,8 +339,8 @@ llvm::Value *ModuleBuilder::valueForIfElse(shared_ptr<ExpressionIfElse> expressi
// Then // Then
builder->SetInsertPoint(thenBlock); builder->SetInsertPoint(thenBlock);
llvm::Value *thenValue = valueForExpression(expression->getThenBlock()->getResultStatementExpression()->getExpression());
buildStatement(expression->getThenBlock()->getStatementBlock()); buildStatement(expression->getThenBlock()->getStatementBlock());
llvm::Value *thenValue = valueForExpression(expression->getThenBlock()->getResultStatementExpression()->getExpression());
builder->CreateBr(mergeBlock); builder->CreateBr(mergeBlock);
thenBlock = builder->GetInsertBlock(); thenBlock = builder->GetInsertBlock();
@@ -350,8 +350,8 @@ llvm::Value *ModuleBuilder::valueForIfElse(shared_ptr<ExpressionIfElse> expressi
llvm::Value *elseValue = nullptr; llvm::Value *elseValue = nullptr;
if (expression->getElseBlock() != nullptr) { if (expression->getElseBlock() != nullptr) {
valuesCount++; valuesCount++;
elseValue = valueForExpression(expression->getElseBlock()->getResultStatementExpression()->getExpression());
buildStatement(expression->getElseBlock()->getStatementBlock()); buildStatement(expression->getElseBlock()->getStatementBlock());
elseValue = valueForExpression(expression->getElseBlock()->getResultStatementExpression()->getExpression());
} }
builder->CreateBr(mergeBlock); builder->CreateBr(mergeBlock);
elseBlock = builder->GetInsertBlock(); elseBlock = builder->GetInsertBlock();
@@ -359,13 +359,18 @@ llvm::Value *ModuleBuilder::valueForIfElse(shared_ptr<ExpressionIfElse> expressi
// Merge // Merge
fun->insert(fun->end(), mergeBlock); fun->insert(fun->end(), mergeBlock);
builder->SetInsertPoint(mergeBlock); builder->SetInsertPoint(mergeBlock);
llvm::PHINode *phi = builder->CreatePHI(typeForValueType(expression->getValueType()), valuesCount, "phii");
if (elseValue != nullptr && thenValue->getType() != elseValue->getType()) {
return llvm::UndefValue::get(typeVoid);
} else {
llvm::PHINode *phi = builder->CreatePHI(thenValue->getType(), valuesCount, "ifElseResult");
phi->addIncoming(thenValue, thenBlock); phi->addIncoming(thenValue, thenBlock);
if (elseValue != nullptr) if (elseValue != nullptr)
phi->addIncoming(elseValue, elseBlock); phi->addIncoming(elseValue, elseBlock);
return phi; return phi;
} }
}
llvm::Value *ModuleBuilder::valueForVar(shared_ptr<ExpressionVariable> expression) { llvm::Value *ModuleBuilder::valueForVar(shared_ptr<ExpressionVariable> expression) {
llvm::AllocaInst *alloca = allocaMap[expression->getName()]; llvm::AllocaInst *alloca = allocaMap[expression->getName()];