----
struct Result
{
int value = 0;
ubyte len = 0;
}
void stompStack(ubyte val) { ubyte[1024] x = val; }
Result resultWithGarbagePadding()
{
Result result = void;
result.value = 0;
result.len = 0;
return result;
}
void main()
{
Result r;
stompStack(1);
Result s = resultWithGarbagePadding();
assert(s.tupleof == r.tupleof); /* passes, ok */
assert(*cast(ubyte[5]*)&s == *cast(ubyte[5]*)&r); /* passes, ok */
assert(s == r); /* fails, should pass */
assert(s is r); /* fails, should probably pass */
}
----
Spec says [1]: "Equality for struct objects means the logical product of all equality results of the corresponding object fields."
[1] https://dlang.org/spec/expression.html#EqualExpression
(In reply to Walter Bright from comment #1)
> The PR does not affect the `is` comparisons. I'm not sure yet if it should.
I think we're good with regards to `is`. The spec says: "For struct objects [...], identity is defined as the bits in the operands being identical." The padding is part of "the bits", so including it in the comparison is correct.
I don't know why I thought `is` should behave differently. Maybe I had missed that sentence in the spec.
(In reply to Walter Bright from comment #2)
> Now fixed for the == and != case.
I'm not a fan of calling this "fixed" when it needs a special compiler switch.
Comment #4 by robert.schadek — 2024-12-13T18:48:43Z