Why is this not a warning?

Basile B via Digitalmars-d digitalmars-d at puremagic.com
Thu Mar 17 05:40:44 PDT 2016


On Thursday, 17 March 2016 at 12:35:27 UTC, Basile B wrote:
> import std.traits;
>
> bool safeIntegralCmp(string op, L, R)(auto ref L lhs, auto ref 
> R rhs)
> if (isIntegral!R && isIntegral!L)
> {
>     // safe
>     static if (is(Unqual!L == Unqual!R))
>     {
>         mixin("return lhs" ~ op ~ "rhs;");
>     }
>     else
>     {
>         // promote unsigned to bigger signed
>         static if (isSigned!L && R.sizeof < 8)
>         {
>             long widenedRhs = rhs;
>             mixin("return lhs" ~ op ~ "widenedRhs;");
>         }
>         else static if (isSigned!R && L.sizeof < 8)
>         {
>             long widenedLhs = lhs;
>             mixin("return widened" ~ op ~ "rhs;");
>         }
>         // not fixable by operand widening
>         else
>         {
>             pragma(msg, "warning, comparing a" ~ L.stringof ~ " 
> with a" ~ R.stringof
>                 ~ " may result into wrong results");
>             mixin("return lhs" ~ op ~ "rhs;");
>         }
>     }
> }

Obviously I meant to write this:

[...]
static if (isSigned!L && !isSigned!R  && R.sizeof < 8)
[...]
else static if (isSigned!R && !isSigned!L  && L.sizeof < 8)

It makes more sense...



More information about the Digitalmars-d mailing list