mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-02-03 05:23:14 +01:00
Fix function literals. They never carry a context.
Fixes: run/f/foreach_36_A
This commit is contained in:
37
gen/toir.cpp
37
gen/toir.cpp
@@ -2064,22 +2064,31 @@ DValue* FuncExp::toElem(IRState* p)
|
||||
|
||||
DtoForceDefineDsymbol(fd);
|
||||
|
||||
const LLType* dgty = DtoType(type);
|
||||
LLValue* lval = DtoAlloca(dgty,"dgstorage");
|
||||
LLValue *lval, *fptr;
|
||||
if(fd->tok == TOKdelegate) {
|
||||
const LLType* dgty = DtoType(type);
|
||||
lval = DtoAlloca(dgty,"dgstorage");
|
||||
|
||||
LLValue* context = DtoGEPi(lval,0,0);
|
||||
LLValue* cval;
|
||||
IrFunction* irfn = p->func();
|
||||
if (irfn->nestedVar)
|
||||
cval = irfn->nestedVar;
|
||||
else if (irfn->nestArg)
|
||||
cval = irfn->nestArg;
|
||||
LLValue* context = DtoGEPi(lval,0,0);
|
||||
LLValue* cval;
|
||||
IrFunction* irfn = p->func();
|
||||
if (irfn->nestedVar)
|
||||
cval = irfn->nestedVar;
|
||||
else if (irfn->nestArg)
|
||||
cval = irfn->nestArg;
|
||||
else
|
||||
cval = getNullPtr(getVoidPtrType());
|
||||
cval = DtoBitCast(cval, context->getType()->getContainedType(0));
|
||||
DtoStore(cval, context);
|
||||
|
||||
fptr = DtoGEPi(lval,0,1,"tmp",p->scopebb());
|
||||
} else if(fd->tok == TOKfunction) {
|
||||
const LLType* fnty = DtoType(type);
|
||||
lval = DtoAlloca(fnty,"fnstorage");
|
||||
fptr = lval;
|
||||
}
|
||||
else
|
||||
cval = getNullPtr(getVoidPtrType());
|
||||
cval = DtoBitCast(cval, context->getType()->getContainedType(0));
|
||||
DtoStore(cval, context);
|
||||
|
||||
LLValue* fptr = DtoGEPi(lval,0,1,"tmp",p->scopebb());
|
||||
assert(0 && "fd->tok must be TOKfunction or TOKdelegate");
|
||||
|
||||
assert(fd->ir.irFunc->func);
|
||||
LLValue* castfptr = DtoBitCast(fd->ir.irFunc->func, fptr->getType()->getContainedType(0));
|
||||
|
||||
Reference in New Issue
Block a user