On 07/08/13 19:54, monarch_dodra wrote:
> struct S(R)
> {
>     R _input;
>     void foo()
>     {
>         static assert(is(typeof(_input[size_t.max .. size_t.max]))); //ok
>         static assert(is(typeof(_input[size_t.max .. $]))); //ok
>     }
>     static assert(is(typeof(_input[size_t.max .. size_t.max]))); //ok
>     static assert(is(typeof(_input[size_t.max .. $]))); //NOPE!
> }

> As you can see, the static if behaves differently in a function, or in the 
> raw body of the struct. Is this normal? Anybody know what is going on 
> exactly? I'm trying to get more context here...
> 
> -----------------------------------------------
> 
> Second, one of the things I found strange was that only *1* of the two 
> assertions failed. basically, _input[0 .. 1] is fair game, yet, _input[0 .. 
> $] is not? What gives? I put my nose in cycles's opDollar. It is written like 
> this:

Did you really mean size_t.*max* above?

Anyway, when '$' is rewritten as 'opDollar' and that is defined
as a non-static method, it would be surprising if calling the
method did work w/o any context pointer...

> //----
>         private static struct DollarToken {}
>         DollarToken opDollar()
>         {
>             return DollarToken.init;
>         }
> //----
> Nothing special about it. Just a function that returns an object. Declaring 
> it const/nothrow/@safe *and* pure does not fix the problem...
> 
> *HOWEVER* declaring it as a manifest constant *does* fix the issue:
> //----
>         private static struct DollarToken {}
>         enum opDollar = DollarToken.init;
> //----

Does declaring the opDollar "function" as `static` fix it?

artur

Reply via email to