dmd 2.049 bug with take and SList?

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Wed Oct 13 11:06:15 PDT 2010


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


More information about the Digitalmars-d-learn mailing list