An incorrect associative array work?

Steven Schveighoffer schveiguy at gmail.com
Sat Sep 19 19:57:16 UTC 2020


On 9/19/20 3:38 PM, Dark Hole wrote:
> Let's take a look at this code:
> 
> int[char[]] test;
> char[4] buf = "abcd";
> test[buf] = 1;
> buf = "evil";
> writeln(test);

If you print typeof(test), you will see: int[const(char)[]]. In other 
words, the compiler has modified the type you asked for into one that 
accepts const keys.

I hate this aspect of AAs, a const key is no better than a mutable key, 
as mutable keys convert implicitly to const!

> What we're expecting to see:
> ["abcd":1]
> But real result is:
> ["evil":1]

What is happening is that you replaced the key data, and the char[4] 
implicitly casts to a dynamic array (another horrible aspect of D).

If you tried to access test["abcd"] OR test["evil"] you would get a 
range error.

If you returned from this function, you now have a dangling pointer. 
This code is all kinds of bad, it shouldn't compile.

> But if we replace static array with dynamic, we'll get error "key must 
> be immutable".

Hilarious. I don't even know where that error comes from, but it's 
totally incorrect. Both the error text is incorrect (it doesn't only 
accept immutable keys) and the fact that the key type is const means the 
mutable value should really bind to const.

Add on to that but it ACCEPTED the mutable char[4] as a key!

As a demo, try this out:

char[] buf = "abcd".dup;
const b = buf;
test[b] = 1;
buf[] = "evil";

Now, same exact result. Which is why we really should either accept 
mutable keys and allow whatever happens to happen, or accept ONLY 
immutable or value-types as keys.

> Not exactly what we expected, but ok. If we declare test 
> as int[char[4]], it works as expected.

Now THIS is more correct -- a char[4] is a value type, not a reference 
type. And so when you use it as a key, it makes a COPY to store in the 
associative array. So it works as designed.

I highly recommend either using strings as keys, or using value types.

> 
> So, is this behaviour bug?

Yes, I think there are several. And I believe they are all in bugzilla, 
but don't have the time to look right now.

-Steve


More information about the Digitalmars-d mailing list