There is one issue I have encountered during CDGC porting I may need advice with.
Consider this simple snippet:

```
import core.memory;

void main()
{
    ubyte[] result;
    result.length = 4096;
    assert(GC.sizeOf(result.ptr) > 0);
}
``

Assertion passes with D1/Tango runtime but fails with current D2 runtime. This happens because `result.ptr` is not actually a pointer returned by gc_qalloc from array reallocation, but interior pointer 16 bytes from the start of that block. Druntime stores some metadata (length/capacity I presume) in the very beginning.

As a result GC.sizeOf(array.ptr) results in 0 (being an interior pointer).

Interesting side effect is that this code:

```
void main()
{
    ubyte[] result;
    result.length = 4096;
    GC.free(result.ptr);
}
```

..does not actually free anything for the very same reason (result.ptr is interior pointer), it just silently succeeds doing nothing.

Is such behaviour intended?

Reply via email to