April 12, 2021
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: nobody@puremagic.com
          Reporter: bugzilla@digitalmars.com

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.

--