[Issue 13179] AA key type TagIndex now requires equality rather than comparison

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Mon Jul 21 13:55:26 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=13179

--- Comment #2 from Kenji Hara <k.hara.pg at gmail.com> ---
(In reply to Jacob Carlborg from comment #0)
> Building Tango with 2.066.0-b5 results in the following error:
> 
> tango/text/Regex.d(2532): Error: AA key type TagIndex now requires equality
> rather than comparison
> tango/text/Regex.d(2532):        Please define opEquals, or remove opCmp to
> also rely on default memberwise comparison.
> 
> I can see that opEquals should be used and not opCmp for AA keys, but if
> opCmp is defined, why doesn't the compiler automatically generate opEquals
> that calls opCmp?

It's intended behavior, because compiler cannot know whether the generated
opEquals is what programmer is expecting.

(In reply to Jacob Carlborg from comment #1)
> Reduced test case:
> 
> struct TagIndex
> {
>     uint tag, index;
> 
>     const int opCmp(ref const TagIndex o)
>     {
[snip]
>     }
> }
> 
> int[TagIndex] a;

In D, all struct define default member-wise equality for == operator.

TagIndex t1, t2;
// t1 == t2 will be rewritten as:
//    t1.tupleof == t2.tupleof
// and then it will mean:
//    t1.tag == t2.tag && t1.index == t2.index

If TagIndex is used for AA keys, compiler cannot determine which is the
intended 'equality', t1 == t2 or t1.opCmp(t2) == 0.

So compiler requests you to resolve the ambiguity by defining opEquals or
removing opCmp.

--


More information about the Digitalmars-d-bugs mailing list