Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision ccb447e9609db81bd657114979c4e4e539785111)
+++ src/SymTab/Autogen.cc	(revision 39f84a4e271ab1b20b0bd4bae4f1ca69460c1dc7)
@@ -189,9 +189,11 @@
 		}
 
+		InitTweak::InitExpander srcParam( src );
+
 		// assign to destination (and return value if generic)
 		UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );
 		derefExpr->get_args().push_back( new VariableExpr( dstParam ) );
 		Expression *dstselect = new MemberExpr( field, derefExpr );
-		genImplicitCall( src, dstselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );
+		genImplicitCall( srcParam, dstselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );
 
 		if ( isGeneric && returnVal ) {
@@ -199,5 +201,5 @@
 			derefRet->get_args().push_back( new VariableExpr( returnVal ) );
 			Expression *retselect = new MemberExpr( field, derefRet );
-			genImplicitCall( src, retselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );
+			genImplicitCall( srcParam, retselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );
 		} // if
 	}
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision ccb447e9609db81bd657114979c4e4e539785111)
+++ src/SymTab/Autogen.h	(revision 39f84a4e271ab1b20b0bd4bae4f1ca69460c1dc7)
@@ -22,4 +22,5 @@
 #include "SynTree/Declaration.h"
 #include "SynTree/Initializer.h"
+#include "InitTweak/InitTweak.h"
 
 namespace SymTab {
@@ -36,9 +37,9 @@
 	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
 	template< typename OutputIterator >
-	void genCall( Expression * srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool forward = true );
+	void genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool forward = true );
 
 	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Should only be called with non-array types.
 	template< typename OutputIterator >
-	void genScalarCall( Expression *srcParam, Expression *dstParam, const std::string & fname, OutputIterator out ) {
+	void genScalarCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out ) {
 		// want to be able to generate assignment, ctor, and dtor generically,
 		// so fname is either ?=?, ?{}, or ^?{}
@@ -48,8 +49,18 @@
 		fExpr->get_args().push_back( new AddressExpr( dstParam ) );
 
-		if ( srcParam ) {
+    Statement * listInit = srcParam.buildListInit( fExpr );
+    if ( listInit ) {
+      *out++ = listInit;
+    }
+
+    std::list< Expression * > args = *++srcParam;
+    fExpr->get_args().splice( fExpr->get_args().end(), args );
+/*		if ( srcParam ) {
+			// xxx -
+			// make srcParam more complicated
+			// if srcParam contains
 			fExpr->get_args().push_back( srcParam );
 		}
-
+*/
 		*out++ = new ExprStmt( noLabels, fExpr );
 	}
@@ -58,5 +69,5 @@
 	/// If forward is true, loop goes from 0 to N-1, else N-1 to 0
 	template< typename OutputIterator >
-	void genArrayCall( Expression *srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, ArrayType *array, bool forward = true ) {
+	void genArrayCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, ArrayType *array, bool forward = true ) {
 		static UniqueName indexName( "_index" );
 
@@ -100,11 +111,14 @@
 		dstParam = dstIndex;
 
-		// srcParam is NULL for default ctor/dtor
-		if ( srcParam ) {
-			UntypedExpr *srcIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
-			srcIndex->get_args().push_back( srcParam );
-			srcIndex->get_args().push_back( new VariableExpr( index ) );
-			srcParam = srcIndex;
-		}
+		// srcParam must keep track of the array indices to build the
+		// source parameter and/or array list initializer
+		srcParam.addArrayIndex( new VariableExpr( index ), array->get_dimension()->clone() );
+
+		// if ( srcParam ) {
+		// 	UntypedExpr *srcIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
+		// 	srcIndex->get_args().push_back( srcParam );
+		// 	srcIndex->get_args().push_back( new VariableExpr( index ) );
+		// 	srcParam = srcIndex;
+		// }
 
 		// for stmt's body, eventually containing call
@@ -122,5 +136,5 @@
 
 	template< typename OutputIterator >
-	void genCall( Expression * srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool forward ) {
+	void genCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool forward ) {
 		if ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {
 			genArrayCall( srcParam, dstParam, fname, out, at, forward );
@@ -135,5 +149,5 @@
 	/// ImplicitCtorDtorStmt node.
 	template< typename OutputIterator >
-	void genImplicitCall( Expression * srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) {
+	void genImplicitCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) {
 		ObjectDecl *obj = dynamic_cast<ObjectDecl *>( decl );
 		assert( obj );
