On Sunday, 24 May 2015 at 19:48:05 UTC, Jonathan M Davis wrote:
The original code is clearly wrong. And forcing the order of
evaluation so that it's one way or the other just changes under
which cases you end up with bugs. Mutating in an expression
while using it multiple times in that expression or mutating a
variable in an expression while using a variable that depends
on it is just plain error-prone and is a serious code smell.
I really don't see anything wrong with what the compiler is
doing in this case. The problem is that the code was making bad
assumptions.
We agree on the original code smell.
I think the evaluation order should be well-defined by the
language though, following the intuitive left-to-right order for
cases like this. Left-hand-side before right-hand-side in assign
statements, container before its index/index range, for the
latter start before end etc.
Then at least all compilers of that language exhibit the same
behavior and we don't end up with cases like this, where LDC
complains and DMD compiles. Even worse would be not-so-obvious
side effects caused by differing evaluation orders of different
compilers, with a fair potential for nasty bugs.