On Mon, Aug 30, 2010 at 1:21 PM, Stanislav Blinov <
stanislav.bli...@gmail.com> wrote:

> Philippe Sigaud wrote:
>
>>        static assert( a1.length != 1 || !is( a1.field[0] == Variant ),
>>
>>
>>    Is that so? I thought ParameterTypeTuple and Tuple are different.
>>
>>
>> You're right, there are different. ParameterTypeTuple is a type tuple (a
>> bunch of types grouped together, with indexing and length, like an array).
>> Tuple is a struct wrapping a type tuple, which can be exposed through the
>> .field member.
>>
>> In the above line, since a1 is a ParameterTypeTuple, it has no .field
>> member. In effect the expression a1.field[0] == Variant has no meaningful
>> type and so is(...) is always false. Hence, || !is(...) is like || true. It
>> disables the second part of the test.
>>
>
> Thanks, I thought I'm at a loss.
>
>
>
>> As for std.concurrency, I never looked at the code before, but the point
>> of receive() seems to do compile-time checking on the matching functions
>> before calling mbox.get( ops ), it's a good idea to put make the if
>> statement a static if: all other constructs in there are done compile-time,
>> I'd guess.
>>
>
> Yes, that's it. And one (final from me :) ) proposed fix for current Phobos
> would be this:
>
> The mentioned line (384) of std.concurrency should read:
>
> static assert( !T[i+1..$].length || a1.length != 1 || !is( a1[0] == Variant
> ),
>
> The error occurs currently because function parameter is enforced NOT to be
> a Variant even for last function in the list (because of i < T.length  on
> line 382). Thus, assert triggers no matter where in receive() do you insert
> a Variant handler. Proposed workaround should overcome this by adding
> additional condition that currently examined handler is not the last one in
> the list.
>
>
Thank you guys.  I see that I am too dangerous with .field

Reply via email to