implicit casts between integer/floating point types yay!!

This commit is contained in:
apio 2022-08-26 17:29:20 +02:00
parent 792a689005
commit 734537a528
6 changed files with 51 additions and 4 deletions

View File

@ -40,6 +40,30 @@ void FunctionNode::codegen(IRBuilder* builder, llvm::Module* module)
if (llvm::Value* retVal = body->codegen(builder))
{
if (retVal->getType() != prototype.returnType)
{
if (retVal->getType()->isIntegerTy() && prototype.returnType->isIntegerTy())
{
retVal = builder->getBuilder()->CreateIntCast(retVal, prototype.returnType, true);
}
else if (retVal->getType()->isFloatingPointTy() && prototype.returnType->isFloatingPointTy())
{
retVal = builder->getBuilder()->CreateFPCast(retVal, prototype.returnType);
}
else if (retVal->getType()->isIntegerTy() && prototype.returnType->isFloatingPointTy())
{
retVal = builder->getBuilder()->CreateCast(llvm::Instruction::SIToFP, retVal, prototype.returnType);
}
else if (retVal->getType()->isFloatingPointTy() && prototype.returnType->isIntegerTy())
{
retVal = builder->getBuilder()->CreateCast(llvm::Instruction::FPToSI, retVal, prototype.returnType);
}
else
{
Error::throw_error_without_location(
format_string("The %s function's body type does not match its return type", prototype.name));
}
}
builder->getBuilder()->CreateRet(retVal);
if (llvm::verifyFunction(*Function))

View File

@ -10,7 +10,8 @@ Parser::Parser(const TokenStream& tokens) : tokens(tokens)
{
m_type_map = {{"void", llvm::Type::getVoidTy(*globalContext)}, {"bool", llvm::Type::getInt1Ty(*globalContext)},
{"i8", llvm::Type::getInt8Ty(*globalContext)}, {"i16", llvm::Type::getInt16Ty(*globalContext)},
{"i32", llvm::Type::getInt32Ty(*globalContext)}, {"i64", llvm::Type::getInt64Ty(*globalContext)}};
{"i32", llvm::Type::getInt32Ty(*globalContext)}, {"i64", llvm::Type::getInt64Ty(*globalContext)},
{"f32", llvm::Type::getFloatTy(*globalContext)}, {"f64", llvm::Type::getDoubleTy(*globalContext)}};
}
std::shared_ptr<Parser> Parser::new_parser(const TokenStream& tokens)

View File

@ -2,8 +2,13 @@
"file": "float-expr.sp",
"compile": {
"flags": [],
"exit-code": 1,
"exit-code": 0,
"stdout": "",
"stderr": "\u001b[1;1m\u001b[31;49merror: \u001b[0;0mInvalid function main\n"
"stderr": ""
},
"run": {
"exit-code": 3,
"stdout": "",
"stderr": ""
}
}

View File

@ -0,0 +1,14 @@
{
"file": "unmatched-integer-type.sp",
"compile": {
"flags": [],
"exit-code": 0,
"stdout": "",
"stderr": ""
},
"run": {
"exit-code": 0,
"stdout": "",
"stderr": ""
}
}

View File

@ -0,0 +1,3 @@
let @main : i64 in {
0
}

View File

@ -4,6 +4,6 @@
"flags": [],
"exit-code": 1,
"stdout": "",
"stderr": "\u001b[1;1m\u001b[31;49merror: \u001b[0;0mInvalid function main\n"
"stderr": "\u001b[1;1m\u001b[31;49merror: \u001b[0;0mThe main function's body type does not match its return type\n"
}
}