comparison gen/statements.cpp @ 974:815e1b8c6b00

Allow 'return exp;' for void main(). It's unfortunate that for main the llvm type and D type don't match up...
author Christian Kamm <kamm incasoftware de>
date Tue, 17 Feb 2009 18:53:15 +0100
parents 03d7c4aac654
children fe93215deb82
comparison
equal deleted inserted replaced
973:d96471e8b5e5 974:815e1b8c6b00
88 } 88 }
89 89
90 if (Logger::enabled()) 90 if (Logger::enabled())
91 Logger::cout() << "return value is '" <<*v << "'\n"; 91 Logger::cout() << "return value is '" <<*v << "'\n";
92 92
93 // can happen for classes 93 // can happen for classes and void main
94 if (v->getType() != p->topfunc()->getReturnType()) 94 if (v->getType() != p->topfunc()->getReturnType())
95 { 95 {
96 v = gIR->ir->CreateBitCast(v, p->topfunc()->getReturnType(), "tmp"); 96 // for main and a void expression: return 0 instead, else bitcast
97 if (p->topfunc() == p->mainFunc && v->getType() == LLType::VoidTy)
98 v = llvm::Constant::getNullValue(p->mainFunc->getReturnType());
99 else
100 v = gIR->ir->CreateBitCast(v, p->topfunc()->getReturnType(), "tmp");
101
97 if (Logger::enabled()) 102 if (Logger::enabled())
98 Logger::cout() << "return value after cast: " << *v << '\n'; 103 Logger::cout() << "return value after cast: " << *v << '\n';
99 } 104 }
100 105
101 DtoEnclosingHandlers(enclosinghandler, NULL); 106 DtoEnclosingHandlers(enclosinghandler, NULL);