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