Mercurial > projects > ldc
diff gen/llvmhelpers.cpp @ 1185:8baf611f0009
Fix nested references to 'ref' foreach variables.
These "walk around" the array being iterated over, so they're a bit trickier
than other variables to get right.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Wed, 01 Apr 2009 00:01:44 +0200 |
parents | ed4b050ada45 |
children | c0091f3b72f1 |
line wrap: on
line diff
--- a/gen/llvmhelpers.cpp Tue Mar 31 03:06:19 2009 +0200 +++ b/gen/llvmhelpers.cpp Wed Apr 01 00:01:44 2009 +0200 @@ -1075,7 +1075,7 @@ } // does pretty much the same as DtoDeclarationExp, except it doesn't initialize, and only handles var declarations -LLValue* DtoRawVarDeclaration(VarDeclaration* var) +LLValue* DtoRawVarDeclaration(VarDeclaration* var, LLValue* addr) { // we don't handle globals with this one assert(!var->isDataseg()); @@ -1083,10 +1083,6 @@ // we don't handle aliases either assert(!var->aliassym); - // if this already has storage, it must've been handled already - if (var->ir.irLocal && var->ir.irLocal->value) - return var->ir.irLocal->value; - // referenced by nested function? #if DMDV2 if (var->nestedrefs.dim) @@ -1095,10 +1091,10 @@ #endif { assert(var->ir.irLocal); - assert(!var->ir.irLocal->value); - - // alloca - var->ir.irLocal->value = DtoAlloca(DtoType(var->type), var->toChars()); + if(!var->ir.irLocal->value) + var->ir.irLocal->value = addr ? addr : DtoAlloca(DtoType(var->type), var->toChars()); + else + assert(!addr || addr == var->ir.irLocal->value); // store the address into the nested vars array assert(var->ir.irLocal->nestedIndex >= 0); @@ -1110,9 +1106,15 @@ // normal local variable else { + // if this already has storage, it must've been handled already + if (var->ir.irLocal && var->ir.irLocal->value) { + assert(!addr || addr == var->ir.irLocal->value); + return var->ir.irLocal->value; + } + assert(!var->ir.isSet()); var->ir.irLocal = new IrLocal(var); - var->ir.irLocal->value = DtoAlloca(DtoType(var->type), var->toChars()); + var->ir.irLocal->value = addr ? addr : DtoAlloca(DtoType(var->type), var->toChars()); } // add debug info