Index: expression.c
===================================================================
--- expression.c	(revision 283)
+++ expression.c	(working copy)
@@ -3351,8 +3351,14 @@
 		}
 	    }
 	    else
-	    {	e = v->type->defaultInit();
-		e->loc = loc;
+	    {		    
+		if (v->type->toBasetype()->ty == Tstruct)		
+		    e = ((TypeStruct *)v->type->toBasetype())->defaultInitAsStructLiteral(loc);
+		else
+		{
+		    e = v->type->defaultInit();
+		    e->loc = loc;
+		}
 	    }
 	    offset = v->offset + v->type->size();
 	}
Index: interpret.c
===================================================================
--- interpret.c	(revision 283)
+++ interpret.c	(working copy)
@@ -1560,24 +1560,6 @@
 
 
 /********************************
- * Necessary because defaultInit() for a struct is a VarExp, not a StructLiteralExp.
- */
-StructLiteralExp *createDefaultInitStructLiteral(Loc loc, StructDeclaration *sym)
-{
-    Expressions *structelems = new Expressions();
-    structelems->setDim(sym->fields.dim);
-    for (size_t j = 0; j < structelems->dim; j++)
-    {
-	structelems->data[j] = ((VarDeclaration *)(sym->fields.data[j]))->type->defaultInit();
-    }
-    StructLiteralExp *structinit = new StructLiteralExp(loc, sym, structelems);
-    // Why doesn't the StructLiteralExp constructor do this, when
-    // sym->type != NULL ?
-    structinit->type = sym->type;
-    return structinit;
-}
-
-/********************************
  *  Add v to the istate list, unless it already exists there.
  */
 void addVarToInterstate(InterState *istate, VarDeclaration *v)
@@ -1636,7 +1618,7 @@
 	}
 	else if (v && v->value && (v->value->op==TOKindex || v->value->op == TOKdotvar))
 	{
-            // It is no longer be a TOKvar, eg when a[4] is passed by ref.
+            // It is no longer a TOKvar, eg when a[4] is passed by ref.
 	    e1 = v->value;	    
 	}
     }
@@ -1678,7 +1660,8 @@
 		 */
 		if (v->type->toBasetype()->ty == Tstruct && e2->op == TOKint64)
 		{
-		    e2 = v->type->defaultInit();
+		    TypeStruct * ts = (TypeStruct *)(v->type->toBasetype());		    
+		    e2 = ts->defaultInitAsStructLiteral(loc); //createDefaultInitStructLiteral(loc, ts->sym); 
 		}
 		e2 = Cast(v->type, v->type, e2);
 	    }
@@ -2004,8 +1987,7 @@
 	    if (telem->ty != Tstruct) { return EXP_CANT_INTERPRET; }
 
 	    // Create a default struct literal...
-	    StructDeclaration *sym = ((TypeStruct *)telem)->sym;
-	    StructLiteralExp *structinit = createDefaultInitStructLiteral(v->loc, sym);
+	    Expression *structinit = ((TypeStruct *)telem)->defaultInitAsStructLiteral(v->loc);
 
 	    // ... and use to create a blank array literal
 	    size_t dim = ((TypeSArray *)t)->dim->toInteger();
@@ -2686,7 +2668,10 @@
 	    if (v)
 	    {	e = se->getField(type, v->offset);
 		if (!e)
+		{
+		    error("couldn't find field %s in %s",v->toChars(), type->toChars());
 		    e = EXP_CANT_INTERPRET;
+		}
 		return e;
 	    }
 	} else error("%s.%s is not yet implemented at compile time", ex->toChars(), var->toChars());
Index: mtype.c
===================================================================
--- mtype.c	(revision 283)
+++ mtype.c	(working copy)
@@ -6204,6 +6204,37 @@
     return new VarExp(sym->loc, d);
 }
 
+/********************************
+ * As for defaultInit, except that it creates a struct literal
+ * Necessary because defaultInit() for a struct is a VarExp, not a StructLiteralExp.
+ */
+Expression *TypeStruct::defaultInitAsStructLiteral(Loc loc)
+{
+    Expressions *structelems = new Expressions();
+    structelems->setDim(sym->fields.dim);
+    for (size_t j = 0; j < structelems->dim; j++)
+    {
+	VarDeclaration *vd = (VarDeclaration *)(sym->fields.data[j]);
+	Expression *e;
+	if (vd->init)
+	    e = vd->init->toExpression();
+	else
+	{
+	    if (vd->type->toBasetype()->ty == Tstruct)
+	        e = ((TypeStruct *)vd->type->toBasetype())->defaultInitAsStructLiteral(loc);	    
+	    else
+	        e = vd->type->defaultInit();
+	}
+	structelems->data[j] = e;
+    }
+    StructLiteralExp *structinit = new StructLiteralExp(loc, (StructDeclaration *)sym, structelems);
+    // Why doesn't the StructLiteralExp constructor do this, when
+    // sym->type != NULL ?
+    structinit->type = sym->type;
+    return structinit;
+
+}
+
 int TypeStruct::isZeroInit(Loc loc)
 {
     return sym->zeroInit;
Index: mtype.h
===================================================================
--- mtype.h	(revision 283)
+++ mtype.h	(working copy)
@@ -653,6 +653,7 @@
     Expression *dotExp(Scope *sc, Expression *e, Identifier *ident);
     unsigned memalign(unsigned salign);
     Expression *defaultInit(Loc loc);
+    Expression *defaultInitAsStructLiteral(Loc loc);
     int isZeroInit(Loc loc);
     int isAssignable();
     int checkBoolean();
