[Issue 22717] New: object.TypeInfo_Struct.equals swaps lhs and rhs parameters
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Jan 31 11:19:00 UTC 2022
https://issues.dlang.org/show_bug.cgi?id=22717
Issue ID: 22717
Summary: object.TypeInfo_Struct.equals swaps lhs and rhs
parameters
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: critical
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: ibuclaw at gdcproject.org
Related to issue 1622 and issue 5854.
---
void main()
{
static struct S
{
int value;
version (XopEquals)
{
bool opEquals(const S rhs) const
{
assert(this.value == 42);
return true;
}
}
else
{
bool opEquals(const ref S rhs) const
{
assert(this.value == 42);
return true;
}
}
}
auto a = S(42);
auto b = S(24);
auto ti = typeid(S);
assert(ti.equals(&a, &b));
}
---
Unfortunately this requires a coordinated fix in both druntime and dmd
(Monorepo, anyone?).
1. Swap `(p1, p2)` around:
https://github.com/dlang/druntime/blob/e390ba7e0a1f80f15e72ca773fca7252057ba4c5/src/object.d#L1887
2. Generate `return (q == p)`:
https://github.com/dlang/dmd/blob/5436d4d167e41f59b799071d8136bb051c87ae56/src/dmd/clone.d#L579-L581
Existing code in the wild already relies on this buggy behavior. For instance,
in the DMD compiler itself:
https://github.com/dlang/dmd/blob/master/src/dmd/dtemplate.d#L7810
If `opEquals(const ref)` was called properly by druntime, then the above quoted
line should instead be: `(cast()ti).equalsx(cast()s.ti);`
--
More information about the Digitalmars-d-bugs
mailing list