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.

Reply via email to