[Issue 19021] New: [REG 2.077] Type merging immutable -> mutable broken in AST
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Jun 24 14:19:16 UTC 2018
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: nobody at puremagic.com
Reporter: ibuclaw at 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.
--
More information about the Digitalmars-d-bugs
mailing list