https://issues.dlang.org/show_bug.cgi?id=19021
Issue ID: 19021 Summary: [REG 2.077] Type merging immutable -> mutable broken in AST Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: regression Priority: P1 Component: dmd Assignee: nob...@puremagic.com Reporter: ibuc...@gdcproject.org Commit that caused regression. https://github.com/dlang/dmd/pull/6998/commits/46b0f6b9a2a089ed6dcd106ca03fc7b2e040385d#diff-33cd340a268c63317687a0a372cd3d94L403 It happen that there are two mutable types T that have different deco, but point to the same immutable!T because of failure to recognize that T and T are the same type. --- struct MultiwayMerge() { bool compFront() { return true; } struct BinaryHeap(alias less) { struct Impl { int _payload; } void initialize() { immutable Impl init; checkTypes(init); } void checkTypes(T)(immutable T init) { alias IT = typeof(init); // immutable(Impl) alias MT = T; // Impl static assert(MT.mangleof == "S6setops__T13MultiwayMergeZQq__T10BinaryHeapS_DQBu__TQBqZQBu9compFrontMFNaNbNiNfZbZQBz4Impl"); static assert(IT.mangleof == "yS6setops__T13MultiwayMergeZQq__T10BinaryHeapS_DQBu__TQBqZQBu9compFrontMFNaNbNiNfZbZQBz4Impl"); } // Should be same as MT static assert(Impl.mangleof == "S6setops__T13MultiwayMergeZQq__T10BinaryHeapS_DQBu__TQBqZQBu9compFrontMFNaNbNiNfZbZQBz4Impl"); } BinaryHeap!(compFront) _heap; } MultiwayMerge!() multiwayMerge; --- What looks to be the case is that mangleToBuffer is called before compFront has finished its semantic, so the first mutable T does not have pure nothrow @nogc encoded into its symbol. --