diff --git a/gen/statements.cpp b/gen/statements.cpp index eb1676f18a..e95af13b84 100644 --- a/gen/statements.cpp +++ b/gen/statements.cpp @@ -90,10 +90,15 @@ void ReturnStatement::toIR(IRState* p) if (Logger::enabled()) Logger::cout() << "return value is '" <<*v << "'\n"; - // can happen for classes + // can happen for classes and void main if (v->getType() != p->topfunc()->getReturnType()) { - v = gIR->ir->CreateBitCast(v, p->topfunc()->getReturnType(), "tmp"); + // for main and a void expression: return 0 instead, else bitcast + if (p->topfunc() == p->mainFunc && v->getType() == LLType::VoidTy) + v = llvm::Constant::getNullValue(p->mainFunc->getReturnType()); + else + v = gIR->ir->CreateBitCast(v, p->topfunc()->getReturnType(), "tmp"); + if (Logger::enabled()) Logger::cout() << "return value after cast: " << *v << '\n'; } diff --git a/tests/mini/mainvoidreturn.d b/tests/mini/mainvoidreturn.d new file mode 100644 index 0000000000..f7edf43754 --- /dev/null +++ b/tests/mini/mainvoidreturn.d @@ -0,0 +1,7 @@ +void foo() +{} + +void main() +{ + return foo(); +}