[Issue 23239] New: Type with destructor returned from helper function moved without postblit or copyctor
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Jul 11 09:31:38 UTC 2022
https://issues.dlang.org/show_bug.cgi?id=23239
Issue ID: 23239
Summary: Type with destructor returned from helper function
moved without postblit or copyctor
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: major
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: default_357-line at yahoo.de
Consider this code:
import std.stdio;
@safe:
void main() {
auto value = make;
writefln!"field is at %s"(&value.field);
value.field = 5;
assert(value.dg() == 5);
}
Test make() {
return Test(0);
}
struct Test
{
int field;
int delegate() dg;
@disable this(this);
@disable this(ref Test);
this(int) scope {
this.dg = {
writefln!"get field at %s"(&this.field);
return this.field;
};
}
~this() { writefln!"Now destroyed."; }
}
Struct Test has forbidden any form of copying or moving via `@disable this`.
We'd assume that either NRVO and inlining would let the constructor be called
with `this` at the final location in `with (make)` in main, or some part of
this would error. However, even with -dip1000 in master
(v2.100.0-8763-gcdfadf8a18), the compiler calls `this(int)` with a different
address than `value` in main, and never tries to call postblit or the copy
constructor. As a result, the assert fails.
--
More information about the Digitalmars-d-bugs
mailing list