From 11f19eec5af4d0c2991abb857ea6f1233bde7d6e Mon Sep 17 00:00:00 2001 From: David Nadlinger Date: Fri, 12 Aug 2011 20:14:55 +0200 Subject: [PATCH] D1: Don't crash when returning a void expression from void main(). --- gen/statements.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gen/statements.cpp b/gen/statements.cpp index 76226af9..63e609d8 100644 --- a/gen/statements.cpp +++ b/gen/statements.cpp @@ -117,24 +117,25 @@ void ReturnStatement::toIR(IRState* p) // the return type is not void, so this is a normal "register" return else { - LLValue* v; - DValue* dval = exp->toElem(p); - #if DMDV2 // call postblit if necessary if (!p->func()->type->isref) - callPostblitHelper(loc, exp, dval->getRVal()); + callPostblitHelper(loc, exp, exp->toElem(p)->getRVal()); #endif + LLValue* v; if (!exp && (p->topfunc() == p->mainFunc)) v = LLConstant::getNullValue(p->mainFunc->getReturnType()); else + { // do abi specific transformations on the return value + DValue* dval = exp->toElem(p); #if DMDV2 v = p->func()->type->fty.putRet(exp->type, dval, p->func()->type->isref); #else v = p->func()->type->fty.putRet(exp->type, dval); #endif + } if (Logger::enabled()) Logger::cout() << "return value is '" <<*v << "'\n";