diff 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
line wrap: on
line diff
--- 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';
             }