[Issue 21745] New: Closure created in struct constructor passed to class constructor is not heap allocated
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Mar 22 06:57:03 UTC 2021
https://issues.dlang.org/show_bug.cgi?id=21745
Issue ID: 21745
Summary: Closure created in struct constructor passed to class
constructor is not heap allocated
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: enhancement
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: default_357-line at yahoo.de
Despite clearly escaping, a delegate created in a struct constructor and passed
to a class constructor is allocated on the heap.
Consider a class:
class Bar
{
int delegate() dg;
this(int delegate() dg) { this.dg = dg; }
}
And a struct:
struct Foo
{
int i;
Bar bar;
this(int i)
{
this.i = i;
this.bar = new Bar({ return this.i; });
}
}
And a helper function, just to ensure that the variable gets a deterministic
location on the stack:
Foo getFoo(int i) { return Foo(i); }
Then when we
void main() {
auto foo = getFoo(5);
getFoo(6);
writefln!"%s"(foo.bar.dg());
assert(foo.bar.dg() == 5);
}
We see that dg returns 6, despite belonging to the constructor where i was 5.
--
More information about the Digitalmars-d-bugs
mailing list