https://issues.dlang.org/show_bug.cgi?id=22854
--- Comment #4 from Iain Buclaw <[email protected]> --- Tweaking the code to use a regular foreach: --- void main() { foreach (ch; SomeContainer().range) { } } pragma(msg, main()); --- This is where the temporary gets *pushed* onto the CTFE stack. --- // If the comma returns a temporary variable, it needs to be an lvalue // (this is particularly important for struct constructors) if (e.e1.op == EXP.declaration && e.e2.op == EXP.variable && e.e1.isDeclarationExp().declaration == e.e2.isVarExp().var && e.e2.isVarExp().var.storage_class & STC.ctfe) { VarExp ve = e.e2.isVarExp(); VarDeclaration v = ve.var.isVarDeclaration(); ctfeGlobals.stack.push(v); // <--- here --- However for `static foreach`, this is never done because of the equality condition (declaration == var) is not true. This despite both declarationexp and varexp having the same identifier name (__slSomeCo3). Obviously, *something* has been copied that really shouldn't have been. --
