On Tuesday, 9 November 2021 at 19:30:20 UTC, tchaloupka wrote:
On Monday, 8 November 2021 at 23:26:39 UTC, tchaloupka wrote:
Bug or feature? :)
I've reported it in
https://issues.dlang.org/show_bug.cgi?id=22498.
It doesn't copy. It just destructs the same object twice... Ouch.
Change the destructor to `~this() { printf("~this(%d)\n", n); n =
12; }` and you'll see.
I have been looking at LDC's IR of this. `unwrap` takes a lvalue,
but the compiler puts the object from `gen` on main's stack and
gives a pointer to unwrap instead. `unwrap` is now the sole owner
of the object, and calls the destructor before returning a ref to
one of its fields.
I haven't figured out the interplay of features and optimizations
here, but it looks like a leak. I would have expected @safe to
catch this.
As you said in the bug, NVRO solves it (not sure why). As well as
not passing a lvalue into `unwrap` in the first place.