changeset 90:39648eb578f6

more Expressions work
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Mon, 30 Aug 2010 20:27:56 +0100
parents 23280d154c5b
children 21a53563c840
files dmd/Array.d dmd/ArrayExp.d dmd/ArrayInitializer.d dmd/ArrayLiteralExp.d dmd/AssignExp.d dmd/AssocArrayLiteralExp.d dmd/BinExp.d dmd/CallExp.d dmd/DotIdExp.d dmd/ForeachStatement.d dmd/FuncDeclaration.d dmd/InlineDoState.d dmd/NewExp.d dmd/PragmaDeclaration.d dmd/StructLiteralExp.d dmd/TemplateDeclaration.d dmd/TemplateInstance.d dmd/TraitsExp.d dmd/TupleExp.d dmd/expression/Index.d dmd/expression/Slice.d
diffstat 21 files changed, 121 insertions(+), 147 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/Array.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/Array.d	Mon Aug 30 20:27:56 2010 +0100
@@ -210,6 +210,13 @@
         return _data;
     }
 
+	
+
+    @property T *ptr()
+    {
+        return _data;
+    }
+	
     @property final size_t allocdim()
     {
         return _allocdim;
--- a/dmd/ArrayExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/ArrayExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -51,7 +51,7 @@
 			// Convert to IndexExp
 			if (arguments.dim != 1)
 				error("only one index allowed to index %s", t1.toChars());
-			e = new IndexExp(loc, e1, cast(Expression)arguments.data[0]);
+			e = new IndexExp(loc, e1, arguments[0]);
 			return e.semantic(sc);
 		}
 
--- a/dmd/ArrayInitializer.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/ArrayInitializer.d	Mon Aug 30 20:27:56 2010 +0100
@@ -129,7 +129,7 @@
 		type = Type.terror;
 		for (size_t i = 0; i < value.dim; i++)
 		{
-			if (index.data[i])
+			if (index[i])
 				goto Laa;
 		}
 
@@ -153,7 +153,7 @@
 		/* It's possibly an associative array initializer
 	     */
 	    Initializer iz = cast(Initializer)value.data[0];
-	    Expression indexinit = cast(Expression)index.data[0];
+	    Expression indexinit = index[0];
 	    if (iz && indexinit)
 		{
 			Type t = iz.inferType(sc);
@@ -206,19 +206,19 @@
 			edim = value.dim;
 			for (size_t i = 0, j = 0; i < value.dim; i++, j++)
 			{
-				if (index.data[i])
-					j = cast(uint)(cast(Expression)index.data[i]).toInteger();
+				if (index[i])
+					j = cast(uint)(index[i].toInteger());
 				if (j >= edim)
 					edim = j + 1;
 			}
 		}
 
-		Expressions elements = new Expressions();
+		auto elements = new Expressions();
 		elements.setDim(edim);
 		for (size_t i = 0, j = 0; i < value.dim; i++, j++)
 		{
-			if (index.data[i])
-				j = cast(uint)(cast(Expression)index.data[i]).toInteger();
+			if (index[i])
+				j = cast(uint)(index[i].toInteger());
 			assert(j < edim);
 			Initializer iz = cast(Initializer)value.data[i];
 			if (!iz)
@@ -237,7 +237,7 @@
 			Expression init = null;
 			for (size_t i = 0; i < edim; i++)
 			{
-				if (!elements.data[i])
+				if (!elements[i])
 				{
 					if (!type)
 						goto Lno;
@@ -292,7 +292,7 @@
 			Expression idx;
 			Initializer val;
 
-			idx = cast(Expression)index.data[i];
+			idx = index[i];
 			if (idx)
 				length = cast(uint)idx.toInteger();
 			//printf("\tindex[%d] = %p, length = %u, dim = %u\n", i, idx, length, dim);
--- a/dmd/ArrayLiteralExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/ArrayLiteralExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -66,20 +66,16 @@
 			return this;
 
 		// Run semantic() on each element
-		for (int i = 0; i < elements.dim; i++)
+		foreach (ref Expression e; elements)
 		{	
-			e = elements.data[i];
 			e = e.semantic(sc);
 			assert(e.type);
-			elements[i] = e;
 		}
 
 		expandTuples(elements);
 
-		for (int i = 0; i < elements.dim; i++)
+		foreach (size_t i, Expression e; elements)
 		{	
-			e = cast(Expression)elements.data[i];
-
 			if (!e.type)
 				error("%s has no value", e.toChars());
 
@@ -104,10 +100,10 @@
 
 			if (!committed && e.op == TOKstring)
 			{   
-				StringExp se = cast(StringExp)e;
+				auto se = cast(StringExp)e;
 				se.committed = 0;
 			}
-			elements.data[i] = e;
+			elements[i] = e;
 		}
 
 		if (!t0)
@@ -193,9 +189,8 @@
 	{
 		bool f = false;
 
-		for (size_t i = 0; i < elements.dim; i++)
+		foreach (e; elements)
 		{	
-			Expression e = cast(Expression)elements.data[i];
 			f |= e.checkSideEffect(2);
 		}
 		if (flag == 0 && f == false)
@@ -217,7 +212,7 @@
 		buf.printf("A%u", dim);
 		for (size_t i = 0; i < dim; i++)
 		{	
-			Expression e = cast(Expression)elements.data[i];
+			auto e = elements[i];
 			e.toMangleBuffer(buf);
 		}
 	}
@@ -265,10 +260,9 @@
 					result = MATCHnomatch;
 			}
 
-			for (int i = 0; i < elements.dim; i++)
+			foreach (e; elements)
 			{
-				Expression e = cast(Expression)elements.data[i];
-				MATCH m = cast(MATCH)e.implicitConvTo(tb.nextOf());
+				auto m = cast(MATCH)e.implicitConvTo(tb.nextOf());
 				if (m < result)
 					result = m;			// remember worst match
 				if (result == MATCHnomatch)
@@ -334,10 +328,8 @@
 
 		d = null;
 		pdtend = &d;
-		for (int i = 0; i < elements.dim; i++)
+		foreach (e; elements)
 		{	
-			Expression e = cast(Expression)elements.data[i];
-
 			pdtend = e.toDt(pdtend);
 		}
 		Type t = type.toBasetype();
--- a/dmd/AssignExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/AssignExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -124,7 +124,7 @@
 						if (1 || !global.params.useDeprecated)
 							error("operator [] assignment overload with opIndex(i, value) illegal, use opIndexAssign(value, i)");
 
-						e = new CallExp(loc, e, cast(Expression)ae.arguments.data[0], e2);
+						e = new CallExp(loc, e, ae.arguments[0], e2);
 						e = e.semantic(sc);
 						return e;
 					}
--- a/dmd/AssocArrayLiteralExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/AssocArrayLiteralExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -59,14 +59,14 @@
 
 		// Run semantic() on each element
 		for (size_t i = 0; i < keys.dim; i++)
-		{	Expression key = cast(Expression)keys.data[i];
-			Expression value = cast(Expression)values.data[i];
+		{	auto key = keys[i];
+			auto value = values[i];
 
 			key = key.semantic(sc);
 			value = value.semantic(sc);
 
-			keys.data[i] = key;
-			values.data[i] = value;
+			keys[i] = key;
+			values[i] = value;
 		}
 		expandTuples(keys);
 		expandTuples(values);
@@ -77,8 +77,8 @@
 			values.setDim(0);
 		}
 		for (size_t i = 0; i < keys.dim; i++)
-		{	Expression key = cast(Expression)keys.data[i];
-			Expression value = cast(Expression)values.data[i];
+		{	auto key = keys[i];
+			auto value = values[i];
 
 			if (!key.type)
 				error("%s has no value", key.toChars());
@@ -91,13 +91,13 @@
 				tkey = key.type;
 			else
 				key = key.implicitCastTo(sc, tkey);
-			keys.data[i] = key;
+			keys[i] = key;
 
 			if (!tvalue)
 				tvalue = value.type;
 			else
 				value = value.implicitCastTo(sc, tvalue);
-			values.data[i] = value;
+			values[i] = value;
 		}
 
 		if (!tkey)
@@ -125,7 +125,7 @@
 		e = el_long(TYint, dim);
 		for (size_t i = 0; i < dim; i++)
 		{   
-			Expression el = cast(Expression)keys.data[i];
+			auto el = keys[i];
 
 			for (int j = 0; j < 2; j++)
 			{
@@ -139,13 +139,13 @@
 		//printf("[%d] %s\n", i, el.toChars());
 		//elem_print(ep);
 				e = el_param(ep, e);
-				el = cast(Expression)values.data[i];
+				el = values[i];
 			}
 		}
 
 		Type t = type.toBasetype().mutableOf();
 		assert(t.ty == Taarray);
-		TypeAArray ta = cast(TypeAArray)t;
+		auto ta = cast(TypeAArray)t;
 
 		/* Unfortunately, the hash function for Aa (array of chars) is custom and
 		 * different from Axa and Aya, which get the generic hash function.
@@ -175,8 +175,8 @@
 		bool f = false;
 
 		for (size_t i = 0; i < keys.dim; i++)
-		{	Expression key = cast(Expression)keys.data[i];
-			Expression value = cast(Expression)values.data[i];
+		{	auto key = keys[i];
+			auto value = values[i];
 
 			f |= key.checkSideEffect(2);
 			f |= value.checkSideEffect(2);
@@ -190,8 +190,8 @@
 	{
 		buf.writeByte('[');
 		for (size_t i = 0; i < keys.dim; i++)
-		{	Expression key = cast(Expression)keys.data[i];
-			Expression value = cast(Expression)values.data[i];
+		{	auto key = keys[i];
+			auto value = values[i];
 
 			if (i)
 				buf.writeByte(',');
@@ -207,8 +207,8 @@
 		size_t dim = keys.dim;
 		buf.printf("A%u", dim);
 		for (size_t i = 0; i < dim; i++)
-		{	Expression key = cast(Expression)keys.data[i];
-			Expression value = cast(Expression)values.data[i];
+		{	auto key = keys[i];
+			auto value = values[i];
 
 			key.toMangleBuffer(buf);
 			value.toMangleBuffer(buf);
@@ -223,16 +223,14 @@
 	override Expression optimize(int result)
 	{
 		assert(keys.dim == values.dim);
-		for (size_t i = 0; i < keys.dim; i++)
+		foreach (size_t i, Expression e; keys)
 		{   
-			Expression e = cast(Expression)keys.data[i];
-
 			e = e.optimize(WANTvalue | (result & WANTinterpret));
-			keys.data[i] = e;
+			keys[i] = e;
 
-			e = cast(Expression)values.data[i];
+			e = values[i];
 			e = e.optimize(WANTvalue | (result & WANTinterpret));
-			values.data[i] = e;
+			values[i] = e;
 		}
 		return this;
 	}
@@ -247,8 +245,8 @@
 }
 		for (size_t i = 0; i < keys.dim; i++)
 		{   
-			Expression ekey = cast(Expression)keys.data[i];
-			Expression evalue = cast(Expression)values.data[i];
+			auto ekey = keys[i];
+			auto evalue = values[i];
 			Expression ex;
 
 			ex = ekey.interpret(istate);
@@ -261,7 +259,7 @@
 			{
 				if (keysx == keys)
 					keysx = cast(Expressions)keys.copy();
-				keysx.data[i] = ex;
+				keysx[i] = ex;
 			}
 
 			ex = evalue.interpret(istate);
@@ -274,7 +272,7 @@
 			{
 				if (valuesx == values)
 				valuesx = values.copy();
-				valuesx.data[i] = ex;
+				valuesx[i] = ex;
 			}
 		}
 		
@@ -289,11 +287,11 @@
 		 */
 		for (size_t i = 1; i < keysx.dim; i++)
 		{   
-			Expression ekey = cast(Expression)keysx.data[i - 1];
+			auto ekey = keysx[i - 1];
 
 			for (size_t j = i; j < keysx.dim; j++)
 			{   
-				Expression ekey2 = cast(Expression)keysx.data[j];
+				auto ekey2 = keysx[j];
 				Expression ex = Equal(TOKequal, Type.tbool, ekey, ekey2);
 				if (ex is EXP_CANT_INTERPRET)
 					goto Lerr;
@@ -339,13 +337,13 @@
 		{
 			for (size_t i = 0; i < keys.dim; i++)
 			{   
-				Expression e = cast(Expression)keys.data[i];
-				MATCH m = cast(MATCH)e.implicitConvTo((cast(TypeAArray)tb).index);
+				auto e = keys[i];
+				auto m = cast(MATCH)e.implicitConvTo((cast(TypeAArray)tb).index);
 				if (m < result)
 					result = m;			// remember worst match
 				if (result == MATCHnomatch)
 					break;				// no need to check for worse
-				e = cast(Expression)values.data[i];
+				e = values[i];
 				m = cast(MATCH)e.implicitConvTo(tb.nextOf());
 				if (m < result)
 					result = m;			// remember worst match
@@ -373,13 +371,13 @@
 			assert(keys.dim == values.dim);
 			for (size_t i = 0; i < keys.dim; i++)
 			{   
-				Expression ex = cast(Expression)values.data[i];
+				auto ex = values[i];
 				ex = ex.castTo(sc, tb.nextOf());
-				e.values.data[i] = ex;
+				e.values[i] = ex;
 
-				ex = cast(Expression)keys.data[i];
+				ex = keys[i];
 				ex = ex.castTo(sc, (cast(TypeAArray)tb).index);
-				e.keys.data[i] = ex;
+				e.keys[i] = ex;
 			}
 			e.type = t;
 			return e;
--- a/dmd/BinExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/BinExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -1141,13 +1141,13 @@
 				return EXP_CANT_INTERPRET;
 			}
 			// Get old element
-			Expression vie = cast(Expression)(ae.elements.data[elemi]);
+			auto vie = ae.elements[elemi];
 			if (vie.op != TOKstructliteral)
 				return EXP_CANT_INTERPRET;
 
 			// Work out which field needs to be changed
-			StructLiteralExp se = cast(StructLiteralExp)vie;
-			VarDeclaration vf = (cast(DotVarExp)e1).var.isVarDeclaration();
+			auto se = cast(StructLiteralExp)vie;
+			auto vf = (cast(DotVarExp)e1).var.isVarDeclaration();
 			if (!vf)
 				return EXP_CANT_INTERPRET;
 
--- a/dmd/CallExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/CallExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -108,8 +108,8 @@
 		
 		auto arguments = new Expressions();
 		arguments.setDim(2);
-		arguments.data[0] = earg1;
-		arguments.data[1] = earg2;
+		arguments[0] = earg1;
+		arguments[1] = earg2;
 
 		this.arguments = arguments;
 	}
@@ -174,12 +174,12 @@
 						error("expected key as argument to aa.remove()");
 						goto Lagain;
 					}
-					Expression key = cast(Expression)arguments.data[0];
+					auto key = arguments[0];
 					key = key.semantic(sc);
 					key = resolveProperties(sc, key);
 					key.rvalue();
 
-					TypeAArray taa = cast(TypeAArray)dotid.e1.type.toBasetype();
+					auto taa = cast(TypeAArray)dotid.e1.type.toBasetype();
 					key = key.implicitCastTo(sc, taa.index);
 
 					return new RemoveExp(loc, dotid.e1, key);
@@ -874,7 +874,7 @@
 				// Inline .dup
 				if (fd.ident == Id.adDup && arguments && arguments.dim == 2)
 				{
-					e = cast(Expression)arguments.data[1];
+					e = arguments[1];
 					e = e.interpret(istate);
 					if (e !is EXP_CANT_INTERPRET)
 					{
@@ -907,10 +907,8 @@
 
 		/* If any of the arguments have side effects, this expression does
 		 */
-		for (size_t i = 0; i < arguments.dim; i++)
+		foreach (e; arguments)
 		{   
-			Expression e = cast(Expression)arguments.data[i];
-
 			if (e.checkSideEffect(2))
 				return true;
 		}
@@ -990,7 +988,7 @@
 
 			if (fd && fd.ident == Id.alloca && !fd.fbody && fd.linkage == LINK.LINKc && arguments && arguments.dim == 1)
 			{   
-				Expression arg = cast(Expression)arguments.data[0];
+				auto arg = arguments[0];
 				arg = arg.optimize(WANT.WANTvalue);
 				if (arg.isConst() && arg.type.isintegral())
 				{	
@@ -1060,10 +1058,8 @@
 
 		/* If any of the arguments can throw, then this expression can throw
 		 */
-		for (size_t i = 0; i < arguments.dim; i++)
+		foreach (e; arguments)
 		{   
-			Expression e = cast(Expression)arguments.data[i];
-
 			if (e && e.canThrow())
 				return true;
 		}
--- a/dmd/DotIdExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/DotIdExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -146,10 +146,10 @@
 			exps.setDim(te.exps.dim);
 			for (int i = 0; i < exps.dim; i++)
 			{   
-				Expression ee = cast(Expression)te.exps.data[i];
+				auto ee = te.exps[i];
 				ee = ee.semantic(sc);
 				ee = new DotIdExp(e.loc, ee, Id.offsetof);
-				exps.data[i] = ee;
+				exps[i] = ee;
 			}
 			e = new TupleExp(loc, exps);
 			e = e.semantic(sc);
--- a/dmd/ForeachStatement.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/ForeachStatement.d	Mon Aug 30 20:27:56 2010 +0100
@@ -175,7 +175,7 @@
 				Expression e;
 				Type t;
 				if (te)
-					e = cast(Expression)te.exps.data[k];
+					e = te.exps[k];
 				else
 					t = Argument.getNth(tuple.arguments, k).type;
 
--- a/dmd/FuncDeclaration.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/FuncDeclaration.d	Mon Aug 30 20:27:56 2010 +0100
@@ -2369,7 +2369,7 @@
 
 			for (size_t i = 0; i < dim; i++)
 			{   
-				Expression earg = cast(Expression)arguments.data[i];
+				Expression earg = arguments[i];
 				Argument arg = Argument.getNth(tf.parameters, i);
 
 				if (arg.storageClass & (STCout | STCref))
@@ -2529,7 +2529,7 @@
 		for (size_t i = 0; i < dim; i++)
 		{
 			auto v = cast(VarDeclaration)parameters[i];
-			v.value = cast(Expression)vsave.data[i];
+			v.value = vsave[i];
 		}
 
 		if (istate && !isNested())
@@ -2541,7 +2541,7 @@
 			{   
 				if (auto v = cast(VarDeclaration)s3)
 				{	
-					v.value = cast(Expression)valueSaves.data[i];
+					v.value = valueSaves[i];
 					//printf("\trestoring [%d] %s = %s\n", i, v.toChars(), v.value ? v.value.toChars() : "");
 				}
 			}
@@ -2778,7 +2778,7 @@
 			{
 				auto vfrom = cast(VarDeclaration)parameters[i];
 				VarDeclaration vto;
-				Expression arg = cast(Expression)arguments.data[i];
+				Expression arg = arguments[i];
 				ExpInitializer ei;
 				VarExp ve;
 
--- a/dmd/InlineDoState.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/InlineDoState.d	Mon Aug 30 20:27:56 2010 +0100
@@ -33,10 +33,8 @@
 		newa = new Expressions();
 		newa.setDim(a.dim);
 
-		for (int i = 0; i < a.dim; i++)
+		foreach (size_t i, Expression e; a)
 		{   
-			Expression e = cast(Expression)a.data[i];
-
 			if (e)
 			{
 				e = e.doInline(ids);
--- a/dmd/NewExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/NewExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -347,7 +347,7 @@
 					break;
 				}
 
-				Expression arg = cast(Expression)arguments.data[j];
+				auto arg = arguments[j];
 				arg = resolveProperties(sc, arg);
 				arg = arg.implicitCastTo(sc, Type.tsize_t);
 				arg = arg.optimize(WANTvalue);
@@ -384,23 +384,17 @@
 		// Optimize parameters
 		if (newargs)
 		{
-			for (size_t i = 0; i < newargs.dim; i++)
+			foreach (ref Expression e; newargs)
 			{   
-				Expression e = cast(Expression)newargs.data[i];
-
 				e = e.optimize(WANTvalue);
-				newargs[i] = e;
 			}
 		}
 
 		if (arguments)
 		{
-			for (size_t i = 0; i < arguments.dim; i++)
+			foreach (ref Expression e; arguments)
 			{   
-				Expression e = cast(Expression)arguments.data[i];
-
 				e = e.optimize(WANTvalue);
-				arguments[i] = e;
 			}
 		}
 		return this;
@@ -668,7 +662,7 @@
 			if (arguments.dim == 1)
 			{   
 				// Single dimension array allocations
-				Expression arg = cast(Expression)arguments.data[0];	// gives array length
+				auto arg = arguments[0];	// gives array length
 				e = arg.toElem(irs);
 				ulong elemsize = tda.next.size();
 
@@ -681,9 +675,8 @@
 			{   
 				// Multidimensional array allocations
 				e = el_long(TYint, arguments.dim);
-				for (size_t i = 0; i < arguments.dim; i++)
+				foreach (Expression arg; arguments)
 				{
-					Expression arg = cast(Expression)arguments.data[i];	// gives array length
 					e = el_param(arg.toElem(irs), e);
 					assert(t.ty == Tarray);
 					t = t.nextOf();
--- a/dmd/PragmaDeclaration.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/PragmaDeclaration.d	Mon Aug 30 20:27:56 2010 +0100
@@ -53,15 +53,13 @@
 		{
 			if (args)
 			{
-				for (size_t i = 0; i < args.dim; i++)
+				foreach (e; args)
 				{
-					Expression e = cast(Expression)args.data[i];
-
 					e = e.semantic(sc);
 					e = e.optimize(WANTvalue | WANTinterpret);
 					if (e.op == TOKstring)
 					{
-						StringExp se = cast(StringExp)e;
+						auto se = cast(StringExp)e;
 						writef("%s", se.toChars()[1..$-3] /*se.len, cast(char*)se.string_*/);
 					}
 					else
@@ -158,9 +156,8 @@
 				writef("pragma    %s", ident.toChars());
 				if (args)
 				{
-					for (size_t i = 0; i < args.dim; i++)
+					foreach (size_t i, Expression e; args)
 					{
-						Expression e = cast(Expression)args.data[i];
 						e = e.semantic(sc);
 						e = e.optimize(WANTvalue | WANTinterpret);
 						if (i == 0)
@@ -245,11 +242,11 @@
 		{
 			assert(args && args.dim == 1);
 
-			Expression e = cast(Expression)args.data[0];
+			auto e = args[0];
 
 			assert(e.op == TOKstring);
 
-			StringExp se = cast(StringExp)e;
+			auto se = cast(StringExp)e;
 			char* name = cast(char*)GC.malloc(se.len + 1);
 			memcpy(name, se.string_, se.len);
 			name[se.len] = 0;
@@ -273,7 +270,7 @@
 		else if (ident == Id.startaddress)
 		{
 			assert(args && args.dim == 1);
-			Expression e = cast(Expression)args.data[0];
+			auto e = args[0];
 			Dsymbol sa = getDsymbol(e);
 			FuncDeclaration f = sa.isFuncDeclaration();
 			assert(f);
--- a/dmd/StructLiteralExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/StructLiteralExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -165,7 +165,7 @@
 		{
 			//printf("\ti = %d\n", i);
 			assert(i < elements.dim);
-			e = cast(Expression)elements.data[i];
+			e = elements[i];
 			if (e)
 			{
 				//writef("e = %s, e.type = %s\n", e.toChars(), e.type.toChars());
@@ -180,7 +180,7 @@
 					Expressions z = new Expressions;
 					z.setDim(length);
 					for (int q = 0; q < length; ++q)
-						z.data[q] = e.copy();
+						z[q] = e.copy();
 					e = new ArrayLiteralExp(loc, z);
 					e.type = type;
 				}
@@ -206,7 +206,7 @@
 	
 				if (offset == v.offset && type.size() == v.type.size())
 				{
-					Expression e = cast(Expression)elements.data[i];
+					auto e = elements[i];
 					if (e)
 					{
 						return i;
@@ -386,9 +386,8 @@
 	{
 		bool f = 0;
 
-		for (size_t i = 0; i < elements.dim; i++)
+		foreach (e; elements)
 		{
-			Expression e = cast(Expression)elements.data[i];
 			if (!e)
 				continue;
 	
@@ -413,7 +412,7 @@
 		buf.printf("S%u", dim);
 		for (size_t i = 0; i < dim; i++)
 	    {
-			Expression e = cast(Expression)elements.data[i];
+			auto e = elements[i];
 			if (e)
 				e.toMangleBuffer(buf);
 			else
--- a/dmd/TemplateDeclaration.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/TemplateDeclaration.d	Mon Aug 30 20:27:56 2010 +0100
@@ -822,7 +822,7 @@
 					t.objects.setDim(tuple_dim);
 					for (size_t i = 0; i < tuple_dim; i++)
 					{   
-						Expression farg = cast(Expression)fargs.data[fptupindex + i];
+						auto farg = fargs[fptupindex + i];
 						t.objects.data[i] = cast(void*)farg.type;
 					}
 					declareParameter(paramscope, tp, t);
@@ -893,7 +893,7 @@
 			}
 			else
 			{   
-				Expression farg = cast(Expression)fargs.data[i];
+				auto farg = fargs[i];
 		static if (false) {
 				printf("\tfarg.type   = %s\n", farg.type.toChars());
 				printf("\tfparam.type = %s\n", fparam.type.toChars());
@@ -968,7 +968,7 @@
 					TypeArray ta = cast(TypeArray)tb;
 					for (; i < nfargs; i++)
 					{
-						Expression arg = cast(Expression)fargs.data[i];
+						auto arg = fargs[i];
 						assert(arg);
 						MATCH m;
 						/* If lazy array of delegates,
--- a/dmd/TemplateInstance.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/TemplateInstance.d	Mon Aug 30 20:27:56 2010 +0100
@@ -912,7 +912,7 @@
 				if (ea.op == TOKtuple)
 				{   
 					// Expand tuple
-					TupleExp te = cast(TupleExp)ea;
+					auto te = cast(TupleExp)ea;
 					size_t dim = te.exps.dim;
 					tiargs.remove(j);
 					if (dim)
--- a/dmd/TraitsExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/TraitsExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -309,7 +309,7 @@
 						/* Skip if already present in exps[]
 						 */
 						for (size_t j = 0; j < exps.dim; j++)
-						{   StringExp se2 = cast(StringExp)exps.data[j];
+						{   auto se2 = cast(StringExp)exps[j];
 							if (strcmp(toStringz(str), cast(char*)se2.string_) == 0)
 								goto Lnext;
 						}
--- a/dmd/TupleExp.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/TupleExp.d	Mon Aug 30 20:27:56 2010 +0100
@@ -126,12 +126,12 @@
 			return 1;
 		if ((cast(Expression)o).op == TOKtuple)
 		{
-			TupleExp te = cast(TupleExp)o;
+			auto te = cast(TupleExp)o;
 			if (exps.dim != te.exps.dim)
 				return 0;
 			for (size_t i = 0; i < exps.dim; i++)
-			{   Expression e1 = cast(Expression)exps.data[i];
-				Expression e2 = cast(Expression)te.exps.data[i];
+			{   auto e1 = exps[i];
+				auto e2 = te.exps[i];
 
 				if (!e1.equals(e2))
 					return 0;
@@ -150,21 +150,19 @@
 			return this;
 
 		// Run semantic() on each argument
-		for (size_t i = 0; i < exps.dim; i++)
-		{	Expression e = cast(Expression)exps.data[i];
-
+		foreach (ref Expression e; exps)
+		{
 			e = e.semantic(sc);
 			if (!e.type)
 			{   error("%s has no value", e.toChars());
 				e.type = Type.terror;
 			}
-			exps[i] = e;
 		}
 
 		expandTuples(exps);
 		if (0 && exps.dim == 1)
 		{
-			return cast(Expression)exps.data[0];
+			return exps[0];
 		}
 		type = new TypeTuple(exps);
 		type = type.semantic(loc, sc);
@@ -186,8 +184,8 @@
 
 	override void checkEscape()
 	{
-		for (size_t i = 0; i < exps.dim; i++)
-		{   Expression e = cast(Expression)exps.data[i];
+		foreach(e; exps)
+		{
 			e.checkEscape();
 		}
 	}
@@ -196,9 +194,8 @@
 	{
 		bool f = false;
 
-		for (int i = 0; i < exps.dim; i++)
-		{	Expression e = cast(Expression)exps.data[i];
-
+		foreach(e; exps)
+		{
 			f |= e.checkSideEffect(2);
 		}
 		if (flag == 0 && f == 0)
@@ -208,12 +205,9 @@
 
 	override Expression optimize(int result)
 	{
-		for (size_t i = 0; i < exps.dim; i++)
+		foreach(ref Expression e; exps)
 		{   
-			Expression e = cast(Expression)exps.data[i];
-
 			e = e.optimize(WANTvalue | (result & WANTinterpret));
-			exps[i] = e;
 		}
 		return this;
 	}
--- a/dmd/expression/Index.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/expression/Index.d	Mon Aug 30 20:27:56 2010 +0100
@@ -48,8 +48,8 @@
 		}
 		else if (e1.op == TOKarrayliteral && !e1.checkSideEffect(2))
 		{   
-			ArrayLiteralExp ale = cast(ArrayLiteralExp)e1;
-			e = cast(Expression)ale.elements.data[cast(uint)i];
+			auto ale = cast(ArrayLiteralExp)e1;
+			e = ale.elements[cast(uint)i];
 			e.type = type;
 		}
     }
@@ -59,14 +59,14 @@
 
 		if (e1.op == TOKarrayliteral && !e1.checkSideEffect(2))
 		{   
-			ArrayLiteralExp ale = cast(ArrayLiteralExp)e1;
+			auto ale = cast(ArrayLiteralExp)e1;
 			if (i >= ale.elements.dim)
 			{   
 				e2.error("array index %ju is out of bounds %s[0 .. %u]", i, e1.toChars(), ale.elements.dim);
 			}
 			else
 			{	
-				e = cast(Expression)ale.elements.data[cast(uint)i];
+				e = ale.elements[cast(uint)i];
 				e.type = type;
 			}
 		}
@@ -79,13 +79,13 @@
 		for (size_t i = ae.keys.dim; i;)
 		{
 			i--;
-			Expression ekey = cast(Expression)ae.keys.data[i];
+			auto ekey = ae.keys[i];
 			Expression ex = Equal(TOKequal, Type.tbool, ekey, e2);
 			if (ex is EXP_CANT_INTERPRET)
 				return ex;
 			if (ex.isBool(true))
 			{	
-				e = cast(Expression)ae.values.data[i];
+				e = ae.values[i];
 				e.type = type;
 				break;
 			}
--- a/dmd/expression/Slice.d	Mon Aug 30 19:58:14 2010 +0400
+++ b/dmd/expression/Slice.d	Mon Aug 30 20:27:56 2010 +0100
@@ -72,9 +72,9 @@
 		{
 			auto elements = new Expressions();
 			elements.setDim(cast(uint)(iupr - ilwr));
-			memcpy(elements.data,
-			   es1.elements.data + ilwr,
-			   cast(uint)(iupr - ilwr) * (*es1.elements.data).sizeof);
+			memcpy(elements.ptr,
+			   es1.elements.ptr + ilwr,
+			   cast(uint)(iupr - ilwr) * (*es1.elements.ptr).sizeof);
 			e = new ArrayLiteralExp(e1.loc, elements);
 			e.type = type;
 		}