Mercurial > projects > ldc
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"); }