[dmd-internals] bug 259: error on unsigned/signed comparison
Robert Clipsham
robert at octarineparrot.com
Sun Oct 9 16:32:53 PDT 2011
On 9 October 2011 20:05, Christian Kamm <kamm at incasoftware.de> wrote:
> Hi!
>
> I was briefly looking at
> http://d.puremagic.com/issues/show_bug.cgi?id=259
> today and wondered whether the fix wouldn't be as easy as:
>
> diff --git a/src/cast.c b/src/cast.c
> index c7c78fc..b0c77ee 100644
> --- a/src/cast.c
> +++ b/src/cast.c
> @@ -1629,6 +1629,48 @@ int typeMerge(Scope *sc, Expression *e, Type **pt,
> Expression **pe1, Expression
> TY ty1 = (TY)Type::impcnvType1[t1b->ty][t2b->ty];
> TY ty2 = (TY)Type::impcnvType2[t1b->ty][t2b->ty];
>
> + // For compares, don't blindly convert. One range must contain the
> other.
> + switch (e->op) {
> + case TOKlt:
> + case TOKle:
> + case TOKgt:
> + case TOKge:
> + case TOKunord:
> + case TOKlg:
> + case TOKleg:
> + case TOKule:
> + case TOKul:
> + case TOKuge:
> + case TOKug:
> + case TOKue: {
> + //printf("\tcompare ranges for comparison\n");
> + IntRange r1 = e1->getIntRange();
> + IntRange r2 = e2->getIntRange();
> + //r1.dump("lhs", e1);
> + //r2.dump("rhs", e2);
> +
> + if (IntRange::fromType(t1b).contains(r2)) {
> + //printf("use lhs type\n");
> + t = t1;
> + e2 = e2->castTo(sc, t);
> + goto Lret;
> + }
> + if (IntRange::fromType(t2b).contains(r1)) {
> + //printf("use rhs type\n");
> + t = t2;
> + e1 = e1->castTo(sc, t);
> + goto Lret;
> + }
> +
> + //printf("no safe conversion\n");
> + // better error message!
> + goto Lincompatible;
> +
> + break;
> + }
> + default: break;
> + }
> +
> if (t1b->ty == ty1) // if no promotions
> {
> if (t1 == t2)
>
> What did I miss? Looking at the first couple of errors when building
> druntime,
> they all seem genuine.
>
> One thing is probably C code compatibility. With this change 1u < -1 ==
> false.
>
> Regards,
> Christian
>
See also: https://github.com/D-Programming-Language/dmd/pull/119
--
Robert
http://octarineparrot.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/dmd-internals/attachments/20111010/70f805f0/attachment.html>
More information about the dmd-internals
mailing list