[Issue 5052] New: take!(Take!R) should return Take!R, not Take!(Take!R)

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Oct 13 23:53:32 PDT 2010


http://d.puremagic.com/issues/show_bug.cgi?id=5052

           Summary: take!(Take!R) should return Take!R, not Take!(Take!R)
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: ASSIGNED
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: bugzilla at kyllingen.net
        ReportedBy: bugzilla at kyllingen.net


--- Comment #0 from Lars T. Kyllingstad <bugzilla at kyllingen.net> 2010-10-13 23:52:56 PDT ---
>From D.learn:


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. [...]

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list