Piotr Szturmaj:

> Shouldn't dynamic array be reference type?

They are partially a reference type and partially a value :-)
A D dynamic array is represented with a small struct 2-words long that contains 
the pointer to the first item of the array and the length of the array (you are 
able to read them with the .ptr and .length attributes). So when you copy a 
dynamic array using temp=aa[5] you are copying this little struct. When you 
perform the temp~=1 you are changing the length just of the copied struct, not 
of the original aa[5] one (in D1 if temp~=1 induces a realloc then the pointer 
too gets modified only in the temp struct. In D2 the situation is more complex, 
unfortunately).


> Is this a bug?

It's clearly a bug-prone characteristic of D2, but it's not a D2 bug, so it's a 
bug in your code :-( I think future D2 lint tools will have to test for this 
possible source of bugs too.

Keep in mind that D2 associative arrays have an even worse nature:

void test(int[int] arr, int x) {
    arr[x] = x;
}
void main() {
    int[int] d;
    test(d, 0);
    int[int] d0;
    assert(d == d0);
    d[1] = 1;
    test(d, 2);
    assert(d == [1: 1, 2: 2]);
}

Bye,
bearophile

Reply via email to