diff gen/statements.cpp @ 197:bfcb657756f6 trunk

[svn r213] Fixed: foreach on an object seems to have been broken, the issue was that DMD generates an implicit delegate with conflicting types for 'this'. Fixed: string switch runtime support had wrong param types. Fixed: string switch on a temporary slice was broken.
author lindquist
date Mon, 12 May 2008 20:02:52 +0200
parents 89e21eeaf4c4
children e937752e4541
line wrap: on
line diff
--- a/gen/statements.cpp	Mon May 12 19:10:41 2008 +0200
+++ b/gen/statements.cpp	Mon May 12 20:02:52 2008 +0200
@@ -602,8 +602,27 @@
 
     llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname);
     std::vector<llvm::Value*> args;
+    Logger::cout() << *table->getType() << '\n';
+    Logger::cout() << *fn->getFunctionType()->getParamType(0) << '\n';
+    assert(table->getType() == fn->getFunctionType()->getParamType(0));
     args.push_back(table);
-    args.push_back(e->toElem(gIR)->getRVal());
+
+    DValue* val = e->toElem(gIR);
+    llvm::Value* llval;
+    if (DSliceValue* sval = val->isSlice())
+    {
+        // give storage
+        llval = new llvm::AllocaInst(DtoType(e->type), "tmp", gIR->topallocapoint());
+        DVarValue* vv = new DVarValue(e->type, llval, true);
+        DtoAssign(vv, val);
+    }
+    else
+    {
+        llval = val->getRVal();
+    }
+    assert(llval->getType() == fn->getFunctionType()->getParamType(1));
+    args.push_back(llval);
+
     return gIR->ir->CreateCall(fn, args.begin(), args.end(), "tmp");
 }