error when std.range.Cycle of static array is a member

Steven Schveighoffer schveiguy at yahoo.com
Mon Jul 25 08:25:17 PDT 2011


On Sun, 24 Jul 2011 10:51:32 -0400, Lutger Blijdestijn  
<lutger.blijdestijn at gmail.com> wrote:

> Jonathan M Davis wrote:
>
>> On Sunday 24 July 2011 12:06:47 Lutger Blijdestijn wrote:
>>> I'm trying to have a Cycle range of a static array as a struct member,
>>> but getting a compilation error. Can anybody tell me if I'm doing
>>> something wrong, or is this a bug?
>>>
>>> import std.range;
>>>
>>> struct Foo
>>> {
>>>     ubyte[] buf;
>>>     Cycle!(typeof(buf)) cbuf1; // ok
>>>
>>>     ubyte[1024] staticBuf;
>>>     Cycle!(typeof(staticBuf)) cbuf2; // error
>>>
>>>     void test()
>>>     {
>>>         Cycle!(typeof(staticBuf)) cbuf3;
>>>         cbuf3 = cycle(staticBuf); // ok
>>>     }
>>> }
>>>
>>> /std/range.d(228): Error: template instance
>>> std.array.front!(ubyte[1024u]) incompatible arguments for template
>>> instantiation
>>
>> static arrays are not ranges. You can't pop the front off of them, so no
>> range- based algorithm would work with a static range. Now, you _can_  
>> get
>> a dynamic range over a static range and _that_ is a valid range, so what
>> you need to do is make the Cycle a Cycle!(ubyte[]) rather than
>> Cycle!(ubyte[1024]), and you when you pass the static array to cycle,  
>> you
>> need to slice it: cycle(staticBuf[]).
>>
>> - Jonathan M Davis
>
> That would work, but the docs explicitly mention that Cycle is  
> specialized
> for static arrays (for performance reasons). This is how cycle is
> implemented:
>
> Cycle!(R) cycle(R)(ref R input, size_t index = 0) if (isStaticArray!R)
> {
>     return Cycle!(R)(input, index);
> }

This is definitely a bug.  In fact, it's a regression, since it passes on  
2.051 (fails on 2.052 and later).  The error is occurring during the  
execution of the *template constraint*.

Reduced case:

import std.range;

pragma(msg, isInputRange!(ubyte[2u]).stringof);

If it's not a bug in dmd (or rather it's the result of a fixed bug), then  
it's a bug in Phobos' isInputRange implementation.  However, I doubt  
that.  Also, the same line works in the context of a function:

import std.range;

void main()
{
    pragma(msg, isInputRange!(ubyte[2u]).stringof); // no error
}

Please file a 'rejects-valid' bug.

-Steve


More information about the Digitalmars-d-learn mailing list