On Monday, 27 June 2016 at 02:38:22 UTC, Timon Gehr wrote:
As far as I understand, for the first expression, code gen will generate a reference to a temporary copy of base, and for the second expression, it will generate a reference to base directly. If lwr() or upr() then update the ptr and/or the length of base, those changes will be seen for the second slice expression, but not for the first.
Exactly. That's what I initially asked in
Should the returned slice be based on the slicee's buffer before or after evaluating the bounds expressions?
So Timon prefers the pre-buffer (apparently what DMD does), GDC does the post-buffer, and LDC buggily something inbetween (for $, we treat base.length as lvalue, but we load base.ptr before evaluating the bounds, hence treating base as rvalue there).
Can we agree on something, add corresponding tests and make sure CTFE works exactly the same? %)
The point is that the slice expression itself does or does not see the updates based on whether I wrap base in a lambda or not.
I don't really see a necessity for the lambda to return the same kind (lvalue/rvalue) of value as the expression directly.
