diff dmd/AssignExp.d @ 12:832f71e6f96c

*Exp and *AssignExp arrayOp implementation added (might be a bit incomplete) Some unittest-specific functions implemented
author korDen
date Mon, 12 Apr 2010 15:13:00 +0400
parents 10317f0c89a5
children cab4c37afb89
line wrap: on
line diff
--- a/dmd/AssignExp.d	Wed Mar 31 16:29:36 2010 +0400
+++ b/dmd/AssignExp.d	Mon Apr 12 15:13:00 2010 +0400
@@ -4,8 +4,10 @@
 import dmd.Identifier;
 import dmd.backend.elem;
 import dmd.InterState;
+import dmd.Argument;
 import dmd.IndexExp;
 import dmd.CallExp;
+import dmd.CastExp;
 import dmd.TypeSArray;
 import dmd.StructLiteralExp;
 import dmd.ArrayLengthExp;
@@ -379,12 +381,31 @@
 
 	void buildArrayIdent(OutBuffer buf, Expressions arguments)
 	{
-		assert(false);
+		/* Evaluate assign expressions right to left
+		 */
+		e2.buildArrayIdent(buf, arguments);
+		e1.buildArrayIdent(buf, arguments);
+		buf.writestring("Assign");
 	}
 
 	Expression buildArrayLoop(Arguments fparams)
 	{
-		assert(false);
+		/* Evaluate assign expressions right to left
+		 */
+		Expression ex2 = e2.buildArrayLoop(fparams);
+	version (DMDV2) {
+		/* Need the cast because:
+		 *   b = c + p[i];
+		 * where b is a byte fails because (c + p[i]) is an int
+		 * which cannot be implicitly cast to byte.
+		 */
+		ex2 = new CastExp(Loc(0), ex2, e1.type.nextOf());
+	}
+		Expression ex1 = e1.buildArrayLoop(fparams);
+		Argument param = cast(Argument)fparams.data[0];
+		param.storageClass = STCundefined;
+		Expression e = new AssignExp(Loc(0), ex1, ex2);
+		return e;
 	}
 
 	elem* toElem(IRState* irs)