import std.stdio; void main() { int i = 0b10000000_00000000_00000000_00000010; int iSigned = i >> 2; writefln(" int >>: %.32b", iSigned); int iUnsigned = i >>> 2; writefln(" int >>>: %.32b", iUnsigned); uint u = cast(uint) i; uint uSigned = u >> 2; writefln(" uint >>: %.32b", uSigned); uint uUnsigned = u >>> 2; writefln("uint >>>: %.32b", uUnsigned); } Output (DMD 2.037): int >>: 11100000000000000000000000000000 int >>>: 11100000000000000000000000000000 uint >>: 00100000000000000000000000000000 uint >>>: 00100000000000000000000000000000
Only happens on 2.037, so it's a regression. Also only happens when compiled with -O.
Doesn't seem to happen on DMD1. Code works on DMD1.054beta.
Root cause: A bad refactoring that dropped the conversion to unsigned. PATCH: e2ir.c, line 3008 and 3113 UshrExp::toElem() and UshrAssignExp::toElem() Copy the code from D1. elem *UshrAssignExp::toElem(IRState *irs) { - return toElemBin(irs, OPshrass); + elem *eleft = e1->toElem(irs); + eleft->Ety = touns(eleft->Ety); + elem *eright = e2->toElem(irs); + elem *e = el_bin(OPshrass, type->totym(), eleft, eright); + el_setLoc(e, loc); + return e; } elem *UshrExp::toElem(IRState *irs) { - return toElemBin(irs, OPshr); + elem *eleft = e1->toElem(irs); + eleft->Ety = touns(eleft->Ety); + elem *eright = e2->toElem(irs); + elem *e = el_bin(OPshr, type->totym(), eleft, eright); + el_setLoc(e, loc); + return e; }
Changeset 322
Fixed dmd 2.038