diff gen/toir.c @ 44:ea65e12b0dd0 trunk

[svn r48] fixed some storage problems
author lindquist
date Fri, 19 Oct 2007 16:05:06 +0200
parents 0b9b286b67b6
children 6d60e6049c4e
line wrap: on
line diff
--- a/gen/toir.c	Fri Oct 19 15:26:09 2007 +0200
+++ b/gen/toir.c	Fri Oct 19 16:05:06 2007 +0200
@@ -1027,9 +1027,11 @@
     llvm::FunctionType::param_iterator argiter = llfnty->param_begin();
     int j = 0;
 
+    Logger::println("hidden struct return");
+
     // hidden struct return arguments
     if (retinptr) {
-        if (!p->lvals.empty()) {
+        if (!p->lvals.empty() && p->toplval()) {
             assert(llvm::isa<llvm::StructType>(p->toplval()->getType()->getContainedType(0)));
             llargs[j] = p->toplval();
             if (LLVM_DtoIsPassedByRef(tf->next)) {
@@ -1049,6 +1051,8 @@
         e->type = elem::VAL;
     }
 
+    Logger::println("this arguments");
+
     // this arguments
     if (fn->arg) {
         Logger::println("This Call");
@@ -1071,6 +1075,8 @@
         ++argiter;
     }
 
+    Logger::println("regular arguments");
+
     // regular arguments
     for (int i=0; i<arguments->dim; i++,j++)
     {
@@ -1471,7 +1477,7 @@
     llvm::Value* sptr = 0;
 
     // if there is no lval, this is probably a temporary struct literal. correct?
-    if (p->lvals.empty())
+    if (p->lvals.empty() || !p->toplval())
     {
         sptr = new llvm::AllocaInst(LLVM_DtoType(type),"tmpstructliteral",p->topallocapoint());
         e->mem = sptr;
@@ -2514,7 +2520,7 @@
     Logger::cout() << "array literal has llvm type: " << *t << '\n';
 
     llvm::Value* mem = 0;
-    if (p->lvals.empty()) {
+    if (p->lvals.empty() || !p->toplval()) {
         assert(LLVM_DtoDType(type)->ty == Tsarray);
         mem = new llvm::AllocaInst(t,"tmparrayliteral",p->topallocapoint());
     }