What's going on here?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Jan 9 21:34:28 PST 2014


On 1/9/14 9:08 PM, Manu wrote:
> So I'm interacting with C (although it works the same in D), I call a
> function that returns a pointer, and gives the size through an out arg:
>    ubyte* test(size_t* ptr)
>    {
> *ptr = 100;
> return cast(ubyte*)1234;
>    }
>
>
> And call it, but immediately use the size argument to slice a range:
>    size_t size;
>    ubyte[] t = test(&size)[0..size];
>
> t is null.
>
> If I do this, it works:
>    size_t size;
>    ubyte* pt = test(&size);
>    ubyte[] t = pt[0..size];
>
> Why should I need that extra line?

It's a bug in the compiler. Evaluation should proceed as if it were 
strictly left to right. So test(&size) must be called before size is 
loaded to construct the slice. Please report.

Andrei



More information about the Digitalmars-d mailing list