dmd 2.065.0
Steven Schveighoffer
schveiguy at yahoo.com
Tue Feb 25 11:49:40 PST 2014
On Tue, 25 Feb 2014 14:33:05 -0500, Walter Bright
<newshound2 at digitalmars.com> wrote:
> On 2/25/2014 2:28 AM, Daniel Murphy wrote:
>> Walter + Andrei did it, and it was completely intentional, and it was
>> known that
>> it would break code.
>>
>> https://github.com/D-Programming-Language/dmd/pull/3054
>
> It was intended to only break code that was already broken (would fail
> at runtime). It appears that this turned out to not be entirely true.
I just wrote this and compiled on 2.064:
import std.stdio;
struct S
{
int x;
int y;
bool opEquals(ref const(S) other) const { return other.x == x;}
}
void main()
{
int[S] aa;
aa[S(1, 2)] = 5;
aa[S(1, 3)] = 6;
writeln(aa);
}
Output:
[S(1, 2):5, S(1, 3):6]
Now, clearly this is not correct, and should be flagged by the compiler,
or fixed in the runtime.
I suggest this path:
1. Switch AA to using the 'equals' function
2. Do not allow keys that provide opCmp function but not opEquals (these
will not work correctly)
This will provide a sane implementation and not break existing code when
the default opEquals and opCmp are used (both will act the same as far as
AAs are concerned).
-Steve
More information about the Digitalmars-d-announce
mailing list