On Friday, 5 January 2018 at 18:13:11 UTC, H. S. Teoh wrote:
On Fri, Jan 05, 2018 at 05:50:34PM +0000, jmh530 via
Digitalmars-d-learn wrote:
Be careful with that:
class C { int x; }
immutable C c = new C(5);
auto i = c.x;
C y = cast(C) c;
y.x = 10;
i = c.x; // <-- compiler may assume c.x is still 5
Since c.x is read from an immutable object, the compiler may
assume that its value hasn't changed the second time you access
it, so it may just elide the second assignment to i completely,
thereby introducing a bug into the code.
Basically, casting away immutable is UB, and playing with UB is
playing with fire. :-P
And these things are nasty. We had one in our C project last
month that had us tear our hair out. It was in the end a
documentation problem of gcc that induced the misunderstanding
of the purpose of __attribut__((malloc)) and its effect on
aliased pointer.