April 12, 2021 [Issue 21821] New: Optimizer assumes immutables don't change, but they can in @system code | ||||
---|---|---|---|---|
| ||||
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. -- |
Copyright © 1999-2021 by the D Language Foundation