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:
>>> 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]
>>> 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)
>>> auto len = walkLength(items);
>>> auto r = take(items, len - 1);
>>> void main()
>>> /* array version is fine */
>>> int arr = [1, 2, 3];
>>> 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.
More information about the Digitalmars-d-learn