https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97843
--- Comment #1 from Iain Buclaw <ibuclaw at gdcproject dot org> ---
(In reply to Alex from comment #0)
> This code:
>
> import std.stdio;
>
> ubyte sum(ubyte[] bytes)
> {
> ubyte result;
> foreach(x;bytes)
> result += x;
> return result;
> }
>
> int main()
> {
> ubyte[] bytes = [0,1];
> bytes ~= bytes.sum;
> writefln("sum = %s",bytes[$-1]);
> return 0;
> }
>
> Expected output :
> sum = 1 as confirmed at https://dlang.org/ your code here
> Actual output :
> sum = <random number>
So the array is extended before calling sum(), which doesn't violate LTR order
of precedence that is expected in assignment operations.
A() = B() + C(); // A, B, C
A() += B() + C(); // A, B, C
Despite there being a slight deviation with array concatenation, but that down
to some implementation specific detail that will be resolved upstream druntime
at some point in the future.
X() = Y() ~ Z(); // x86: X, Z, Y
// ARM: X, Y, Z
However, order of evaluation in assignment expressions is explicitly undefined,
both in 10.2.7 [1] and 12.9.5 [2] of the spec. So it would be difficult to
justify whether it is indeed bad code-gen, and writing code that depends on a
specific order of evaluation is not recommended anyway.
[1]: https://dlang.org/spec/expression.html#order-of-evaluation
[2]: https://dlang.org/spec/arrays.html#array-operations