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