https://issues.dlang.org/show_bug.cgi?id=21821
Issue ID: 21821
Summary: Optimizer assumes immutables don't change, but they
can in @system code
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: [email protected]
Reporter: [email protected]
Consider this code from core.lifetime:
void copyEmplacex(ref immutable(S) source, ref immutable(S) target) @system {
import core.stdc.string : memcpy;
memcpy(cast(S*) &target, cast(S*) &source, S.sizeof);
(cast() target).__xpostblit();
}
Note the last line casts away immutability, and the call to __xpostblit()
modifies the supposedly immutable `target`. The part of the optimizer that
fails this is the function Symbol_isAffected() in backend/symbol.d
The fix is to set a flag in `funcsym_p` when it is @safe, and enable the check
for immutability.
--