# HG changeset patch # User Christian Kamm # Date 1234893195 -3600 # Node ID 815e1b8c6b00e45a8432bd6d6b624ac188a10b33 # Parent d96471e8b5e512e318ce727b99cf00a1dbe8a875 Allow 'return exp;' for void main(). It's unfortunate that for main the llvm type and D type don't match up... diff -r d96471e8b5e5 -r 815e1b8c6b00 gen/statements.cpp --- a/gen/statements.cpp Tue Feb 17 18:25:34 2009 +0100 +++ b/gen/statements.cpp Tue Feb 17 18:53:15 2009 +0100 @@ -90,10 +90,15 @@ 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 -r d96471e8b5e5 -r 815e1b8c6b00 tests/mini/mainvoidreturn.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/mini/mainvoidreturn.d Tue Feb 17 18:53:15 2009 +0100 @@ -0,0 +1,7 @@ +void foo() +{} + +void main() +{ + return foo(); +}