On Thursday, 24 January 2019 at 21:03:29 UTC, kinke wrote:
Describing this stuff in detail (rewritten expression?!), isn't
trivial and requires knowledge about how calls and
construction/destruction of argument expressions works.
E.g., the f() call in the code above is lowered to (-vcg-ast):
(bool __gate = false;) , ((A __pfx = a();)) , ((B __pfy =
b();)) , __gate = true , f(__pfx, __pfy);
Here, (only seemingly unused) temporary `__gate` is used to
control the destruction of temporaries with dtors (here just
the `__pfx` arg, as `__pfy` is a special case [no potentially
throwing later argument expressions...]) at the caller side
(false => destruct; true => skip destruction, as it has been
moved successfully to the callee, which destructed it). The
dtor expressions of these temporaries (e.g., `__gate ||
__pfx.~this()` for `__pfx`) aren't visible with `-vg-ast`.
With this DIP, *all* rvalues passed by ref must be lowered to
temporaries. In case they require destruction, the only
difference wrt. the by-value case is that they are *always*
destructed by the caller (after the call, or if an exception is
thrown while they are in scope), i.e., their destruction isn't
controlled by `__gate`.
Exactly, doing something that could result in a different outcome
would be a disaster.