More range woes: composed ranges are unsafe to return from functions

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Oct 17 10:22:23 PDT 2012


On 10/16/12 4:28 PM, jerro wrote:
> On Tuesday, 16 October 2012 at 19:31:18 UTC, H. S. Teoh wrote:
>> On Tue, Oct 16, 2012 at 08:44:56PM +0200, monarch_dodra wrote:
>> [...]
>>> No idea either, but I'll volunteer to investigate ;)
>>>
>>> I agree with Jonathan though, sounds like a bug somewhere. There
>>> is no reason for your code to fail.
>>>
>>> I'll post back if I find anything.
>>
>> Another data point: if I move the .joiner call out of cprod() into
>> main(), then there is no problem. Could it be that something in joiner
>> is breaking somehow, when returned from a function?
>>
>>
>> T
>
> I don't know, but if I change the code to this:
>
> auto cprod(R1,R2)(R1 A, R2 B) {
> // This part is exactly the same as in main(), below. So
> // in theory, it should work exactly the same way.
> auto mapper = (typeof(tuple(cast(size_t) 0, A.front, B.front)) a) => chain(
> zip(repeat(a[1]), B.save.take(a[0])),
> zip(A.save.take(a[0]+1), repeat(a[2])));
>
> auto r = zip(sequence!"n"(cast(size_t)0), A.save, B.save)
> .map!mapper()
> .joiner;
>
> // But something goes wrong here: is it because the
> // above composed ranges are stack-allocated temporaries
> // that go out of scope upon return?
> return r;
> }
>
> It works too.

My guess: there's a bug in handling the stack frame with the lambdas 
involved.

Andrei


More information about the Digitalmars-d mailing list