Hi,

Come here for help. what I doing is setup vim and use dcd for goto define, but sometimes dcd-server got crash, issue is here: https://github.com/Hackerpilot/DCD/issues/294

Then I build the debug version, and an assert error comes out:

https://github.com/Hackerpilot/libdparse/blob/master/src/dparse/parser.d#L6654

paste here:

    T[] ownArray(T)(T[] from)
    {
        if (allocator is null)
            return from;
        if (from.length == 0)
            return null;
T[] to = cast(T[]) allocator.allocate(T.sizeof * from.length); assert (to.length == from.length, format("from.length = %d, to.length = %d", from.length, to.length));
        to[] = from[];
        return to;
    }

For my limited d knowledge, T[] is an array has abi layout:

0: size
size_t: ptr

seems the code try to allocate an array with size from.length, but after cast, the length at offset 0 will be 0, so assert fail(why dmd allow this cast here? I try use GC.malloc and cast in my small test app, dmd will error "Error: cannot cast expression malloc(400LU, 0u, null) of type void* to Node[]").

a quick search, seem we should write it like:

t[] to = (cast(T*)allocator.allocate(T.sizeof * from.length))[0 .. from.length]);

but after this modify, it will crash at
         to[] = from[];



Reply via email to