Mercurial > projects > ddmd
diff dmd/CastExp.d @ 53:a8b50ff7f201
ForeachStatement.syntaxCopy
SliceExp.syntaxCopy
AnonDeclaration.syntaxCopy
SwitchStatement.syntaxCopy
CaseStatement.syntaxCopy
BreakStatement.syntaxCopy
ThrowStatement.syntaxCopy
NewExp.syntaxCopy
DefaultStatement.syntaxCopy
AssertExp.syntaxCopy
ClassDeclaration.syntaxCopy
TypeTypedef.constConv
eval_builtin
ComplexExp.isConst
DVCondition.syntaxCopy
OrExp.getIntRange
AndExp.getIntRange
getMask
IntegerExp.getIntRange
Type.sizemask
CastExp.getIntRange
Expression.getIntRange
author | korDen |
---|---|
date | Sat, 21 Aug 2010 12:15:47 +0400 |
parents | 832f71e6f96c |
children | cab4c37afb89 |
line wrap: on
line diff
--- a/dmd/CastExp.d Sat Aug 21 11:50:50 2010 +0400 +++ b/dmd/CastExp.d Sat Aug 21 12:15:47 2010 +0400 @@ -193,7 +193,29 @@ IntRange getIntRange() { - assert(false); + IntRange ir; + ir = e1.getIntRange(); + // Do sign extension + switch (e1.type.toBasetype().ty) + { + case Tint8: + if (ir.imax & 0x80) + ir.imax |= 0xFFFFFFFFFFFFFF00UL; + break; + case Tint16: + if (ir.imax & 0x8000) + ir.imax |= 0xFFFFFFFFFFFF0000UL; + break; + case Tint32: + if (ir.imax & 0x80000000) + ir.imax |= 0xFFFFFFFF00000000UL; + break; + default: + } + ir.imin &= type.sizemask(); + ir.imax &= type.sizemask(); + //printf("CastExp: imin = x%llx, imax = x%llx\n", ir.imin, ir.imax); + return ir; } Expression optimize(int result)