[Issue 16193] New: opApply() doesn't heap allocate closure
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Wed Jun 22 06:46:23 PDT 2016
https://issues.dlang.org/show_bug.cgi?id=16193
Issue ID: 16193
Summary: opApply() doesn't heap allocate closure
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: schuetzm at gmx.net
// yy.d
module yy;
struct S {
int opApply(int delegate(int) dg) {
foreach(i; 1 .. 10) {
int result = dg(i);
if(result) return result;
}
return 0;
}
}
// xx.d
import yy;
int* px, py;
int foo() {
int x = 0, y = 0;
foreach(i; S.init) {
px = &x; py = &y;
y++;
}
return y;
}
void main() {
import std.stdio;
writeln(foo());
int z = 0;
writeln("&x = ", px, " &y = ", py, " &z = ", &z);
}
# dmd -c xx.d
# dmd -c yy.d
# dmd -ofxx xx.o yy.o
# ./xx
prints:
9
&x = 7FFEAD3C47C0 &y = 7FFEAD3C47C4 &z = 7FFEAD3C47E8
(or similar)
As can be seen, all local variables are allocated next to each other, evidently
on the stack. This happens even though S.opApply() doesn't take its delegate as
scope. I'm deliberately using separate compilation here to make sure that the
compiler has no way to infer that the closure doesn't escape.
--
More information about the Digitalmars-d-bugs
mailing list