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