diff dmd/AndExp.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/AndExp.d	Sat Aug 21 11:50:50 2010 +0400
+++ b/dmd/AndExp.d	Sat Aug 21 12:15:47 2010 +0400
@@ -95,7 +95,35 @@
 
 	IntRange getIntRange()
 	{
-		assert(false);
+		IntRange ir;
+		IntRange ir1 = e1.getIntRange();
+		IntRange ir2 = e2.getIntRange();
+
+		ir.imin = ir1.imin;
+		if (ir2.imin < ir.imin)
+		ir.imin = ir2.imin;
+
+		ir.imax = ir1.imax;
+		if (ir2.imax > ir.imax)
+		ir.imax = ir2.imax;
+
+		ulong u;
+
+		u = getMask(ir1.imax);
+		ir.imin &= u;
+		ir.imax &= u;
+
+		u = getMask(ir2.imax);
+		ir.imin &= u;
+		ir.imax &= u;
+
+		ir.imin &= type.sizemask();
+		ir.imax &= type.sizemask();
+
+	//printf("AndExp: imin = x%llx, imax = x%llx\n", ir.imin, ir.imax);
+	//e1.dump(0);
+
+		return ir;
 	}
 
 	bool isCommutative()