dmd 2.049 bug with take and SList?
Lars T. Kyllingstad
public at kyllingen.NOSPAMnet
Thu Oct 14 00:18:48 PDT 2010
On Thu, 14 Oct 2010 06:54:17 +0000, Lars T. Kyllingstad wrote:
> On Wed, 13 Oct 2010 18:06:15 +0000, Lars T. Kyllingstad wrote:
>
>> On Wed, 13 Oct 2010 16:46:09 +0000, Nick Treleaven wrote:
>>
>>> Hi,
>>> I'm new to D2 ranges but have been following D for some time. I'm
>>> posting here because I want to check if I'm doing anything wrong
>>> before filing a bug.
>>>
>>> The code below is a test case I made after hitting the problem in real
>>> code. Basically the pyramid recursive function should print out: [1,
>>> 2, 3]
>>> [1, 2]
>>> [1]
>>>
>>> This works fine when calling with an int[] range, but calling with
>>> SList!int seems to make the compiler hang, eating up memory.
>>>
>>> Should I file a bug?
>>>
>>>
>>> import std.stdio;
>>> import std.range;
>>> import std.container;
>>>
>>> void pyramid(Range)(Range items)
>>> {
>>> if (items.empty)
>>> return;
>>> writeln(items);
>>> auto len = walkLength(items);
>>> auto r = take(items, len - 1);
>>> pyramid(r);
>>> }
>>>
>>> void main()
>>> {
>>> /* array version is fine */
>>> int[] arr = [1, 2, 3];
>>> pyramid(arr[]);
>>>
>>> SList!int list = [1, 2, 3];
>>> pyramid(list[]); /* infinite loop with dmd 2.049 */
>>> }
>>
>>
>> You are creating an infinite recursion of templates. For an array the
>> return type of take() is the same array type. For other ranges, the
>> return type of take() is Take!Range. So when you instantiate pyramid!
>> Range, it instantiates pyramid!(Take!Range), and then
>> pyramid!(Take!(Take! Range)), and so on ad infinitum.
>>
>> A solution could be to make take!(Take!Range)() just return another
>> Take! Range. I can look into that, but you should file a bug report on
>> it so it's not forgotten.
>>
>> -Lars
>
> http://d.puremagic.com/issues/show_bug.cgi?id=5052
Fixed.
http://www.dsource.org/projects/phobos/changeset/2102
More information about the Digitalmars-d-learn
mailing list